C (s)printf 漏洞利用,$hn 和 %10

Wou*_*tte 2 c exploit string-formatting

当尝试遵循 C 语言字符串漏洞利用教程时,我遇到了以下问题,但我似乎找不到答案。

  1. “如果我们要传递字符串 AAAA%10$n,我们会将值 4 写入地址 0x41414141!”。这是教程的摘录。但是我们怎么写4呢?我确实意识到十六进制的 AAAA 变为 0x41414141 但随后写入 %10$n 。这10是什么意思,这美元是什么意思,4从哪里来?
  2. 下面给出了兵棋漏洞利用的最终解决方案。然而,似乎我可以完全删除 %238x (这到底是什么目的?),这里字符串的结尾是 %10$hn。这里的“hn”是什么意思?C参考文档将“hn”称为“无符号短*”。这还是一种数据类型吗?

$(python -c 'print "\x40\x99\x04\x08%238x%10$hn"')

Ctx*_*Ctx 5

1)%10$n 没有写出来,它是一个格式说明符。它没有输出,只有副作用,即将此说明符之前的输出字符数写入 printf 的第 10 个参数提供的整数。由于您没有向 printf 提供 10 个参数,因此它会从堆栈中获取其他内容并将其用作地址。本教程似乎假设该地址AAAA位于此处并解释为地址 0x41414141。

2)%hn表示在给定地址不写入整数(通常为 4 字节),而只写入短值(通常为 2 字节)。使用此方法写入 2 个 2 字节值而不是 1 个 4 字节值更容易,因为您必须打印最多 4M 字符才能写入所需的值。