2014-09-27 77 views
4

的,我已经看到了下面的例子:认识在shellcode的教程中的shellcode例如

main(){ 

    exit(0); 

} 

当时的想法是创建一个出口() - 系统调用。 这样,那么他们所生产的组件:

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()方法中做了什么。 第一行是好的。但是他们想要在第二和第三行表达什么?

此致

回答

1

的代码采用堆栈变量的地址,然后它上面的地址的两个指针的大小。 然后,无论在这个位置用shellcode的地址覆盖。

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


一般情况下,实际利用会涉及到堆栈缓冲区溢出(即,不检查一下它把它的栈缓冲区的长度,允许一个函数为“溢出”到返回地址) :可以用shellcode填充缓冲区,“溢出”部分将包含缓冲区的地址;这样,当函数退出时,它将在缓冲区内执行shellcode。

+0

只需输入我自己的答案,并通知我,已经有一个.. – starrify 2014-09-27 15:35:44