为什么我不能让 EIP 反映我的输入

逆向工程 x86 开发 缓冲区溢出
2021-06-21 07:53:56

我正在阅读一个教程,该教程向您展示如何在示例 C 程序中利用基于堆栈的缓冲区溢出。C代码是:

#include <string.h>

void function(char *str) {
   char buffer[1024];
   strcpy(buffer,str);
}

int main(int argc,char *argv[])
{
    char aaa[500];
    function(argv[1]);
}

按照作者的说法,如果我们写 1032 个“A”,我们应该能够在 EIP 寄存器中看到“AAAA”。我理解它背后的理论。但是,在 Windows 7 32 位上运行它并使用 Immunity Debugger 对其进行调试时,它会显示“进程终止退出代码 C0000409 ”。EIP指向“ ntdll.RT lUserThreadStart ”。请指教。

2个回答

按照作者的说法,如果我们写 1032 个“A”,我们应该能够在 EIP 寄存器中看到“AAAA”。

这假设程序是在没有(现在是标准的)运行时安全检查的情况下编译的。如果您想在禁用这些安全检查的情况下编译程序,请访问https://stackoverflow.com/寻求帮助

基于 Jason 的回答,这很可能是由于您的编译器 Buffer Security Check。

特别是在 Microsoft 编译器中,'/GS' 选项。

MSDN 页面提供了更好的解释以及一些示例。