8

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

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

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

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

\xdd\xcc\xbb\xaa_%10$x_%54321x_%n"

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

注意:环境有老版本的gcc,不用担心值太大。有什么建议么?谢谢。

4

2 回答 2

2

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

于 2011-01-31T20:37:11.190 回答
0

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

例子 :%23\$n

确保通过检查 \xdd\xcc 的结果来正确获取正确的地址\xbb\xaa_%54321x_%[offset]\$x“这可以通过 python 或 bash 脚本完成

您应该检索地址aabbccdd

于 2016-02-11T14:58:04.010 回答