在引用this website之后,我想模拟一个简单的缓冲区溢出错误
我的环境是ubuntu 10.10
gcc版本是4.4.5
我还下载了execstack以启用文件的可执行堆栈。
以下是我的代码
char code[] = "\x90\x90\x90\x6a\x00\xe8\x39\x07\x00\x00\x90\x90\x90";<
char msg[] = "run !!\n";
int main()
{
int *ptr;
int i;
for(i=1;i<128;i++){
ptr = (int *)&ptr + i;
(*ptr) = (int)code;
}
return 0;
}
我使用g c c-fno stack protector-g-static-o main.out main.c来编译源代码。
但是当我使用gdb调试这个可执行文件时,
奇怪的事情发生了。
下面是gdb输出,如下所示:
(gdb) x/i 0x8048492
0x8048492 <__libc_start_main+402>: call 0x8048bd0 <exit>
(gdb) x/5b 0x8048492
0x8048492 <__libc_start_main+402>: 0xe8 0x39 0x07 0x00 0x00
(gdb) x/i 0x80ce02e
0x80ce02e <code+6>: call 0x80ce76c <_dlfcn_hooks+44>
(gdb) x/5b 0x80ce02e
0x80ce02e <code+6>: 0xe8 0x39 0x07 0x00 0x00
看起来这两个地址的模式是一样的,但是指令是不同的。
有人能帮我解释一下为什么会这样吗。
谢谢!
最佳答案
肯定有缓冲区溢出,但这一行
(*ptr) = (int)code;
在每个位置存储代码的地址,而不是代码数组的内容。