摘要: 本文主要演示linux平台下的栈溢出,首先根据理论对示例代码进行溢出攻击;结果是溢出攻击成立,但是与设想的有差别;然后采用GDB调试工具对发生的意外,进行深入的分析。
测试的平台:1. ubuntu 9; gcc 4.4.1; Gdb 7.0-ubuntu
2. ubuntu系统安装在virtual box 3.2.8虚拟机上;
示例代码如下:
#include
void overflow(char* arg)
{
char buf[12];
strcpy(buf, arg);
}
int main(int argc, char *argv[])
{
if(argc > 1)
overflow(argv[1]);
return 0;
}
如果按照一般的方式编译:
gcc –o stackoverflow stackoverflow.c
linux系统能够探测到程序中的stack overflow,从而终止程序,如下图所示:
那有没有办法让系统不探测到stack overflow,此处可以在编译时,禁用堆栈保护,具体命令如下:
gcc –fno-stack-protector –o stackoverflow stackoverflow.c
然后采用gdb调试stackoverflow,
这里的输出跟设想的存在很大的差别,因为设想中的函数栈如下:
前面的12个字节填充buf,然后接下来的4个字节填充ebp,最后的4个字节填充RET地址,那么照理说,这里的eip应该是0x65656565,那为什么此处是0x61616