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

我正在接受安全课程,需要我们在unix虚拟机上进行格式化字符串攻击。漏洞是使用命令行参数的格式字符串。 我的问题是如何将值写入格式字符串中的地址(如将shell shell代码写入函数返回地址)? 例如,我尝试将值987654写入返回地址位置0xaabbccdd。 我试过像
"AAAA_%10$x"
这样的字符串,这可以导致程序打印
AAAA_41414141
。 然后我用我的地址替换字母并尝试覆盖它。
xddxccxbbxaa_%10$x_%54321x_%n"
但它不起作用。我看到一篇文章说我应该在
%54321x
中使用较小的数字,因为我已经写了一些字符,但我不知道在ѭ3之前我写过多少字符。 注意:环境有一个旧版本的gcc,所以没必要担心这个值太大了。 有什么建议?谢谢。     
已邀请:
如果不使用
%n
格式说明符,
printf
无法写入任何地方。这是你想念的那个。像
%.987654d%n
这样的东西会将数字987654(到目前为止输出的字符数)写入第二个参数指定的地址,其中第一个参数是
int
。这应该足以让你入门。     
通过更改printf函数的字符串打印格式并使其将某些值写入内存中所需的地址位置来利用格式字符串漏洞。 请阅读此博客文章,了解如何执行此操作     
你应该指定堆栈的偏移量来写入%n格式化程序,如
%[offset]$n
例如:
%23$n
一定要通过检查 xdd xcc
xbbxaa_%54321x_%[offset]$x
的结果来正确获取正确的地址“这可以用python或bash脚本完成 你应该检索地址aabbccdd     

要回复问题请先登录注册