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

时间:2011-01-31 19:33:44

标签: c string security format-string

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

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:2)

如果不使用printf格式说明符,

%n无法在任何地方写入。这是你想念的那个。像%.987654d%n之类的东西会将数字987654(到目前为止输出的字符数)写入第二个参数指定的地址,其中第一个参数是int。这应该足以让你入门。

答案 1 :(得分:0)

通过更改printf函数的字符串打印格式并使其将某些值写入内存中所需的地址位置来利用格式字符串漏洞。 请阅读this blog帖子了解如何执行此操作

答案 2 :(得分:0)

你应该指定要使用%%[offset]\$n

等%n格式化程序写入的堆栈的偏移量

示例:%23\$n

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

您应该检索地址 aabbccdd