我正在尝试利用简单的堆栈溢出漏洞。我在c中有一个基本代码:
#include <cstring>
int main( int argc, char** argv )
{
char buffer[500];
strcpy(buffer, argv[1]);
return 0;
}
编译使用-fno-stack-protector
. 我已经计算出缓冲区长度,并且成功覆盖了 EBP 和 EIP 寄存器。我注入了大量的 NOP,然后是这个 shell 代码,最后插入了一个注入的 NOP 所在的地址,以便执行代码。
现在的问题。在所附图片上,您可以看到 gdb 输出。如果我用恶意输入运行我的程序,它会得到一个 SIGSEGV。转储地址0xbffff880
,您可以看到有很多 NOP 后跟 shell 代码(粉红色框),最后是地址(蓝色框)。
我认为这将按如下方式工作:起初0x90909090
s 和 shellcode 被视为简单数据。在这些之后(经过粉红色的框)有一个地址0xbffff880
。我对 CPU 说“嘿,现在请执行正在执行的操作0xbffff880
”。cpu 获取地址上的内容并执行所有 NOP 和 shellcode 本身。然而,这并没有发生并且 SIGSEGV 发生了。
我错在哪里?
我试图在关闭 ASLR 的 32 位 Ubuntu 14.04 Linux 3.13.0-39-generic i686 的 Virtualbox 实例上实现这一点。