格式化字符串并使用%n覆盖具有特定值的内存地址

时间:2013-10-03 18:38:51

标签: c security format-string

我正在阅读并尝试学习格式字符串漏洞。我有一个易受攻击的功能,我理解我的格式字符串的要点。

基本上,这就是我想要做的。传入我的格式字符串,其中包含一些shellcode作为其中的一部分。我还需要格式化我的字符串,以便更换易受攻击函数的返回地址,以便它指向我在堆栈上的shellcode。因此,当函数返回时,它将跳转到堆栈上的shellcode并打开shell。

目前,我正处于可以在堆栈上看到我的shellcode的位置,并且我能够写入返回地址来更改它。问题是,我使用%n作为覆盖返回地址的方式,并且不确定如何使用特定值覆盖%n。当然,%n只是将到目前为止写入的字节数打印到堆栈上的指定地址。我已经阅读了一些关于你如何操纵%n来写出你想要的确切地址/值的东西,但是我对如何做到这一点感到很遗憾。

任何人都能解释一下吗?

编辑: 我已经尝试用'%500d'和“%。500d”等内容填充我的格式字符串以及某些n值的“%nu”。(我也尝试了更小的值)但这只是带来了分段错误。

为了澄清一些困惑,这是我在回复评论时写的一个简单示例:

好的,我会尝试更清楚一点。我有一个易受攻击的程序。易受攻击的一点是“printf(输入);”。我想通过传入格式字符串来利用它。现在,例如,我有一个格式字符串

"\x0c\xde\xbf\xff%08x.%08x.%08x.%08x.%08x.%08x.%n" 

此格式字符串在传递给易受攻击的函数时,将使用写入的字节数覆盖0xffbfde0c的内存地址。我想找出如何修改该格式字符串,以便我可以通过以某种方式填充在%n之前写入的字节数来使%n覆盖特定值。

2 个答案:

答案 0 :(得分:3)

%n写一个数字的唯一方法是让printf打印这个数字。要获得任何指针的值,您需要打印许多字节。

最简单的方法是%999999s

此外,尝试将返回值定向到某个函数(AKA"返回libc")可能更容易,因为代码通常位于相对较低的地址中。

答案 1 :(得分:0)

由于问题是四年前提出的,我认为答案可能没有那么有用。我遇到了同样的问题,并找到了执行此操作的捷径。正如资料所述,使用%hhn是一种更好的方法,摆脱那么多字节。

  

为此,我们使用格式指令标志h,该标志指定使用格式的一半。因此,例如,如果我们使用%hn,那么我们会将格式化的字节数写入2字节的short值。如果我们使用%hhn,那么我们会将格式化后的字节数写入1字节的char值。   materials

一个例子会喜欢这个

"AAAA\x4c\xfd\xff\xbf%08x.%08x.%08x.%08x.%08x.%08x.%hhn"

'A'可以是多个,以匹配所需的数字。