这道题的基本思路参照了KMFL师傅的博客~~~原文链接如下:
原文链接:https://blog.csdn.net/weixin_44145820/article/details/105482269
这里只记录一下整个漏洞利用的第一步也就是利用格式化字符串漏洞泄露Libc地址和代码段地址。
首先gdb,一直调试到
然后调试的时候随便输入一个内容就好,
然后继续走, 到产生漏洞的地方,ida中的这行代码:
在gdb中:
此时寄存器为:
而栈中的数据是:
图中第一个箭头指向了代码段 main+28 的位置,而第二个箭头指向了libc中 __libc_start_main+240 中的位置,
所以通过这两个值就能泄漏出代码段的地址和libc_base。
查一下偏移,64位中还有6个寄存器进行传参,所以相对于输入的第一个箭头指向的位置相对于输入的内容在偏移为11的地方,
同理第二个箭头指向的位置在偏移为15的地方。
所以利用格式化字符串,当我们输入的
时,就会泄漏这两个值,接收后再分别减去在ida中
main+28位置的地址即0x1186和 -240-libc.symbols['__libc_start_main'] 得到两个基址,通过这两个基址可分别计算
存放申请堆块地址的note的位置,以进行接下来的unlink,然后泄漏libc基址的重要性就不多说啦~
最后一句话给自己长记性:调试格式化字符串的时候别在刚输入的时候就断,一定得在产生漏洞的printf(&format)处断,这个错误思想折磨我好久了。。。
初学pwn,有什么错误欢迎各位师傅指正。
--by:newf1rst
来源:oschina
链接:https://my.oschina.net/u/4414894/blog/4280514