如何在格式字符串攻击中将值写入地址

我正在参加一个安全课程,它需要我们在unix虚拟机上进行格式化字符串攻击。 该漏洞是使用命令行参数的格式字符串。

我的问题是如何写入格式字符串的地址值(如写入shell函数返回地址)?

例如,我尝试将值987654写入返回地址位置0xaabbccdd。 我尝试了一些字符串,例如"AAAA_%10$x" ,这可以导致程序打印AAAA_41414141

然后我用我的地址替换这些字母并尝试覆盖它。

xddxccxbbxaa_%10$x_%54321x_%n"

但它不起作用。 我看到一篇文章说我应该在%54321x使用较小的数字,因为我已经写了一些字符,但是我不知道在%54321x之前写了多少个字符。

注意:环境中有一个旧版本的gcc,所以没必要担心这个值太大。 有什么建议么? 谢谢。


如果不使用%n格式说明符, printf不能写入任何地方。 这是你错过的那个。 类似于%.987654d%n会将数字987654(到目前为止输出的字符数)写入由第二个参数指定的地址,其中第一个参数为int 。 这应该足以让你开始。


通过更改printf函数的字符串打印格式并使其将一些值写入内存中所需的地址位置,可以利用格式化字符串漏洞。 请阅读这篇博文,了解如何做到这一点


您应该指定堆栈的最小偏移量,并使用%n格式化程序(如%[offset]$n写入

例如: %23$n

一定要通过cheking的结果正确地得到正确的地址 XDD XCC xbbxaa_%54321x_%[offset]$x “这个可以用Python或bash脚本来完成

你应该检索地址aabbccdd

链接地址: http://www.djcxy.com/p/4587.html

上一篇: How to write value into an address in format string attack

下一篇: AudioQueueFreeBuffer warning