序
做 pwn 题时,经常会遇到题目使用的 libc
版本与自己的虚拟机版本不同的情况,虽然有装各个大版本的 wsl
,但是未免还是会遇到一些小的版本需要亲手去调一调。
查看本机 libc
版本:
ldd --version
使用 patchelf
修改链接后,会发现在使用 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.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
问题分析
libc.so
文件为包含代码的、加载进目标进程地址空间的文件,一般发布时不带调试信息,直接使用这种 .so
文件加载,在 pwndbg
中使用 bins
, heap
等命令将会提示无符号信息。在 gdb 里输入命令:
show debug-file-directory
可以发现单独调试信息文件的目录在 /usr/lib/debug
,libc
的 .dbg
文件与 .so
文件在存储时是独立的两个文件,其中 .dbg
文件中仅包含调试符号信息,不包含代码。
解决方法
我的做法直接将上述的 debug 文件替换成对应 libc
的 .debug
文件,当然在做这一步前应该要确保之后能恢复到原来的环境,或许可以先给虚拟机打个快照。
建议先将原本的 debug 文件拷贝一份到别的地方,方便在调试完之后恢复,这样就能省去打快照、恢复快照的功夫!!!
改 debug 文件的命令如下:
sudo rm -rf /usr/lib/debug
sudo cp -r ~/glibc-all-in-one/libs/2.31xxx/.debug/ /usr/lib/debug
恢复(这里我是将原本的 debug 文件放到了桌面):
sudo rm -rf /usr/lib/debug
sudo cp -r /home/wei/Desktop/debug/ /usr/lib/debug