return-to-libc exploit:在哪里为system()调用提供参数?

时间:2011-10-14 19:52:08

标签: security unix calling-convention shellcode

我正在尝试写一个返回libc漏洞,但我无法弄清堆栈中的哪个位置应该为我的system()调用放置参数。

脆弱的功能是

void func(char *str)
{
     char buffer[12];
     strcpy(buffer,str);
}

此功能的堆栈如下所示:

 -----------
 str
 -----------
 return address
 -----------
 previous frame pointer
 -----------
 buffer
 -----------

我知道我必须使用system()调用的地址覆盖返回地址,但是我应该在哪里放置其参数的地址以及为什么?

感谢。

1 个答案:

答案 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是什么(以避免破坏前一帧指针)。此外,没有一个指针可以包含零字节。