我正在尝试写一个返回libc漏洞,但我无法弄清堆栈中的哪个位置应该为我的system()
调用放置参数。
脆弱的功能是
void func(char *str)
{
char buffer[12];
strcpy(buffer,str);
}
此功能的堆栈如下所示:
-----------
str
-----------
return address
-----------
previous frame pointer
-----------
buffer
-----------
我知道我必须使用system()
调用的地址覆盖返回地址,但是我应该在哪里放置其参数的地址以及为什么?
感谢。
答案 0 :(得分:0)
应该在返回地址的正上方找到指向参数的指针。也就是说,在覆盖之后,你的堆栈看起来应该是这样的:
-----------
shellcode: /bin/whatever ...
...
...
...
\0
-----------
&shellcode <-- str is here
-----------
&system <-- return address is here
-----------
previous frame pointer <--- don't corrupt this
-----------
padding <-- buffer
请注意,这意味着当您到达%esp
时必须知道strcpy
是什么(以避免破坏前一帧指针)。此外,没有一个指针可以包含零字节。