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

Tes*_*sla 7 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" 
Run Code Online (Sandbox Code Playgroud)

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

ugo*_*ren 3

%n写入数字的唯一方法是printf打印该数量的字符。要获取任何指针的值,您需要打印许多字节。

最简单的方法是类似的%999999s

此外,尝试将返回值定向到某个函数(也称为“返回 libc”)可能会更容易,因为代码通常驻留在相对较低的地址中。