了解shellcode示例

时间:2014-09-27 14:44:57

标签: c pointers assembly shellcode opcodes

在shellcode教程中,我看到了以下示例:

 main(){

    exit(0);

 }

想法是创建一个exit() - 系统调用。 那么,他们就产生了组件:

  Section .text

      global _start

 _start:
      mov ebx, 0
      mov eax, 1
      int 0x80

我理解这一点。 0是我们存储在ebx中的exit()的参数,1是退出系统调用的编号,使用0x80我们将CPU更改为内核模式并执行系统调用。

之后,他们让我们生成以下代码:

    bb 00 00 00 00
    b8 01 00 00 00
    cd 80

然后,他们将其转换为C语言,如下所示:

 char example[] = "\xbb\x00\x00\x00\x00"
                  "\xb8\x01\x00\x00\x00"
                  "\xcd\x80"

  int main(){

  int *pointer; 
  pointer = (int *)&pointer+2;
  (*pointer) = (int)example;
  }

所以,我理解的是他们将操作码放在char数组中,但我不明白他们在main() - methode中做了什么。 第一行还可以。但他们想用第2和第3行表达什么?

致以最诚挚的问候,

1 个答案:

答案 0 :(得分:1)

代码获取堆栈变量的地址,然后是地址上面的两个指针大小。 然后,使用shellcode的地址覆盖此位置的任何内容。

如果覆盖的位置是函数的返回地址,那么当函数退出shellcode时将执行。实验和反汇编可以帮助计算从局部变量到返回地址的正确偏移量。


通常,实际利用将涉及堆栈缓冲区溢出(即,不会检查它放入堆栈缓冲区的长度的函数,允许它进入"溢出"进入返回地址):缓冲区可以用shellcode填充,"溢出" part将包含缓冲区的地址;这样,当函数退出时,它将在缓冲区内执行shellcode。