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

时间:2018-12-18 11:29:47

标签: c string-formatting exploit

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

  1. “如果要传递字符串AAAA%10 $ n,则将值4写入地址0x41414141!”。这是a tutorial的摘录。但是我们怎么写4?我确实意识到十六进制的AAAA变为0x41414141,但是随后写入了%10 $ n。这10是什么意思,这美元是什么意思,这4是什么来源?
  2. 战争游戏的最终解决方案如下。但是,看来我可以完全删除%238x(这的目的是什么?),这里字符串的结尾是%10 $ hn。 “ hn”在这里是什么意思? C reference documentation将“ hn”称为“无符号短*”。这甚至是数据类型吗?

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

1 个答案:

答案 0 :(得分:2)

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

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