pwn学习之ret2libc3——偏移计算初体验

拿到题目,先看看保护措施,再拖进ida分析:


image.png

源程序开启了堆栈不可执行保护,问题不大,看ida:


image.png

gets函数高危函数,还是栈溢出的漏洞,下一步找system和/bin/sh
image.png

这题看着好像很麻烦,找不到system和/bin/sh的地址,于是先找到知道的东西先:
先看看栈的大小先:


image.png

这里使用暴力法,扔一堆字符进去!看报错点再哪里,然后可以间接查看栈大小,这是覆盖了返回地址的相对偏移大小,也就是可以直接填充的‘A’的个数,下一步,那么我们如何得到 system 函数的地址呢?这里就主要利用了两个知识点system 函数属于 libc,而 libc.so 动态链接库中的函数之间相对偏移是固定的,也就是说要找基地址,因为公式:A真实地址-A的偏移地址 = B真实地址-B的偏移地址 = 基地址!

基地址大家都一样,间接地通过B来获得基地址从而获得A的真实地址!那么如何得到 libc 中的某个函数的地址呢?我们一般常用的方法是采用 got 表泄露,即输出某个函数对应的 got 表项的内容。当然,由于 libc 的延迟绑定机制,我们需要泄漏已经执行过的函数的地址,已经执行过的话就会在got表生存下来,有了真实的地址!这里,我们选用puts函数实现2次调用,让它生存下来:


image.png

交互时接受返回的地址,由于是32位的文件,每4位切一次片,用u32可以转成地址,


image.png

接下来根据泄露出来的puts的真实地址去查libc的版本:
我们知道这些函数地址是动态链接的,但是最后12位是不变的,利用这个特性,可以查了,


image.png

可见最后的12位是ca0(3*4=12),查表
很好,得到了我们想要的版本了,偏移量随之产生:
image.png

脚本差不多可以写了:


image.png

最后运行下:


image.png

成功提取到权限!这题做了我2个多钟头,一直钻研,当然途中遇到很多的弯路,就不多说了,学习才是王道,加油!

你可能感兴趣的:(pwn学习之ret2libc3——偏移计算初体验)