3

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

易受攻击的功能是

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

此函数的堆栈将如下所示:

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

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

谢谢。

4

1 回答 1

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

于 2011-10-14T20:00:47.643 回答