我正在阅读并尝试学习格式字符串漏洞。我有一个易受攻击的函数,并且我了解与格式字符串有关的内容。

基本上,这就是我要做的。传入我的格式字符串,其中包含一些shellcode。我还需要格式化我的字符串,以便替换易受攻击的函数的返回地址,使其指向堆栈上的shellcode。因此,当函数返回时,它将跳转到我在堆栈上的shellcode并打开一个shell。

当前,我可以在堆栈上看到我的shellcode,并且可以写返回地址来更改它。问题是,我使用%n作为覆盖返回地址的方式,并且不确定如何使%n覆盖特定值。当然,%n仅打印到目前为止已写入堆栈中指定地址的字节数。我已经阅读了几篇有关如何操作%n来编写所需的确切地址/值的内容,但是我对如何做到这一点迷失了。

谁能给我一些启示?

编辑:
我已经尝试用'%500d“和”%.500d“以及”%nu“等填充n个值的格式字符串(我也尝试了更小的值),但这只是带来了段错误。

为了消除困惑,下面是我为回应评论而写的一个简单示例:

好吧,我会尝试变得更加清晰。我有一个易受攻击的程序。易受攻击的点是“printf(input);”。我想通过传递格式字符串来利用这一点。现在,例如,我有一个格式字符串

"\x0c\xde\xbf\xff%08x.%08x.%08x.%08x.%08x.%08x.%n"

该格式字符串在传递给易受攻击的函数时,将用写入的字节数覆盖0xffbfde0c的内存地址。我正在寻找一种方法来修改该格式字符串,以便通过某种方式填充%n之前写入的字节数来使%n覆盖特定的值。

最佳答案

使%n写入数字的唯一方法是使printf打印此数量的字符。要获取任何指针的值,您需要打印许多字节。

最简单的方法是类似于%999999s

同样,尝试将返回值定向到某个函数(也称为“返回libc”)可能会更容易,因为代码通常位于相对较低的地址中。

关于c - 格式化字符串并使用%n覆盖具有特定值的内存地址,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19166698/

10-11 19:07
查看更多