一、问题分析
在动态调试程序的时候,用gdb调试到libc的时候能正确加载符号信息,但同样的程序用IDA调试到libc的时候却缺失了libc中的许多符号,而且对应生成的伪代码可读性极差
这其实是IDA没有正确加载DWARF调试信息所导致的
解决方法是用objcopy把.gnu_debuglink段的内容从
libc-2.23.so改成其他名字,比如
libc-2.23.so.debug,再把.debug文件夹下DWARF调试信息的名字也从
libc-2.23.so改成
libc-2.23.so.debug,这样每次调到libc的时候IDA就能正确加载调试信息了
如图,虽然用的是带调试信息的libc,但是Load debug symbols的时候Output window会输出如下错误信息,这是因为加载了错误的
libc-2.23.so
二、解决方案
切换工作目录到glibc-all-in-one/libs/2.23-0ubuntu10_amd64
然后执行以下命令,对libc进行修改
objcopy -R .gnu_debuglink ./libc-2.23.so
objcopy--add-gnu-debuglink=libc-2.23.so.debug ./libc-2.23.so
mv .debug/libc-2.23.so .debug/libc-2.23.so.debug
再执行以下命令修改要调试的文件,使其加载修改后的libc
patchelf --set-interpreter 你的目录/glibc-all-in-one/libs/2.23-0ubuntu10_amd64/ld-2.23.so 你的程序
patchelf--replace-needed libc.so.6 你的目录/glibc-all-in-one/libs/2.23-0ubuntu10_amd64/libc-2.23.so 你的程序
最后再用IDA来Start或者Attach你的程序
点击右侧的Modules->libc-2.23.so->Load debug symbols
等待左下角显示AU:idle加载完成,此时仍有Name信息加载不全的问题
再点击Modules->libc-2.23.so->Analyze module
然后耐心等待调试信息加载完成
三、运行结果
最后的效果如下,_IO_FILE_plus_1等结构体都能被很好地识别,在右侧注释中有对应的成员信息,而且伪代码也能正常生成了
四、注意事项
apt里的patchelf是0.9版本的,有Bug
要自己到Github上编译0.10版本的才能正常使用
五、参考文献
原文:https://www.cnblogs.com/algonote/p/12729657.html