问题来源:
在做pwn题时,经常遇到题目的libc版本与自己虚拟机的版本不同,
而用patchelf改链接后,gdb堆栈指令看不了,困扰了我很久,终于想到一种
解决方法
实现方法:
我这边拿[2020 新春红包题]这道pwn题做演示
题目可在buuctf中找,它的靶机是Ubuntu 19.04,libc2.29
而我自己的虚拟机为18.04,libc2.27
首先patchelf改链接:
ld可以在glibc-all-in-one中找到
patchelf --replace-needed libc.so.6 你要换的libc的硬路径 ./pwn
patchelf --set-interpreter ld的硬路径 ./pwn
我这里改为
成功改完之后发现gdb堆栈的指令实现不了
出现报错
这里面的下载了也没用
heap: This command only works with libc debug symbols. They can
probably be installed via the package manager of your choice. See
also:
https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.htmlE.g. on Ubuntu/Debian you might need to do the following steps (for
64-bit and 32-bit binaries): sudo apt-get install libc6-dbg sudo dpkg
–add-architecture i386 sudo apt-get install libc-dbg:i386
然后那个pwntools里的gdb.attach()显然也用不了那些看堆栈的指令
我们在gdb里输入命令
show debug-file-directory
可以发现单独调试信息文件的目录在/usr/lib/debug
我们直接找到glibc-all-in-one中对应2.29版本的,把原来的删了,再拷贝2.29的过去就ok了
(只要改一下~/glibc-all-in-one/libs/2.29/这个路径,)
(建议干这之前vmware先拍个快照,题目完事了再复原就好了)
sudo rm -rf /usr/lib/debug
sudo cp -r ~/glibc-all-in-one/libs/2.29/.debug/ /usr/lib/debug
结果:
gdb ./RedPacket_SoEasyPwn1
可以用看堆栈的指令了(虽然它提示no debugging symbols)
然后是pwntool中的gdb.attach()
也可以使用了堆栈的指令了
做题就方便很多了
参考师傅:
https://blog.csdn.net/huzai9527/article/details/118558784?spm=1001.2014.3001.5506
在他的基础上更近一步