用patchelf改程序后在exp中用gdb.attach()调试堆栈

问题来源

在做pwn题时,经常遇到题目的libc版本与自己虚拟机的版本不同,
而用patchelf改链接后,gdb堆栈指令看不了,困扰了我很久,查阅了很多师傅的博客找到了一种解决办法

实现方法:

我这边拿2020纵横杯 wind_farm_panel这道pwn题做演示
它的靶机是Ubuntu 16.04,libc2.23
而我自己的虚拟机为kali 2022.3,libc2.36

首先patchelf改链接:
ld可以在glibc-all-in-one中找到

1
2
patchelf --replace-needed libc.so.6  你要换的libc的硬路径 ./pwn
patchelf --set-interpreter ld的硬路径 ./pwn

我这里改为

image-20230816121058600

成功改完之后发现gdb堆栈的指令实现不了
出现报错
这里面的下载了也没用

1
2
3
4
5
6
7
8
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.html

E.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里输入命令

1
show debug-file-directory

可以发现单独调试信息文件的目录在/usr/lib/debug

image-20230816121221148

我们直接找到glibc-all-in-one中对应2.23版本的,然后使用

1
set debug-file-directory  目录

结果:
gdb ./pwn
可以用看堆栈的指令了(虽然它提示no debugging symbols)

然后是pwntool中的gdb.attach()
也可以使用了堆栈的指令了
做题就方便很多了