GDB:无法加载共享库符号

逆向工程 固件 数据库 开发 奇木 固件分析
2021-06-27 18:55:06

我目前正在查看该死的易受攻击的路由器固件,并且大致遵循此处给出的描述:

https://p16.praetorian.com/blog/getting-started-with-damn-vulnerable-router-firmware-dvrf-v0.1

这意味着我做了以下事情:

  • 用 binwalk 解压固件
  • 将 qemu-mipsel-static 复制到解压固件的 squashfs-root 中
  • 使用 chroot 用 qemu 模拟二进制文件,如下所示:sudo chroot . ./qemu-mipsel-static -g 1234 ./pwnable/Intro/stack_bof_01 test123
  • 启动 GDB 并输入:set architecture mipstarget remote 127.0.0.1:1234

当我现在继续时,c我得到:

(gdb) c 继续。警告:无法加载 3 个库的共享库符号,例如 /lib/libgcc_s.so.1。使用“info sharedlibrary”命令查看完整列表。你需要“set solib-search-path”还是“set sysroot”?[Inferior 1 (Remote target) exited with code 0101] (gdb) info sharedlibrary 目前没有加载共享库。

虽然这只是一个警告并且调试后的程序似乎执行得很好,但我想知道我是否真的需要将更多的库复制到我的 squashfs-root 文件夹中以使其干净。如果是这样,我如何找出哪些库以及从何处获取它们?info sharedlibrary没有产生任何东西)

1个回答

通常,在使用 GDB 交叉调试远程目标时,您不会尝试在加载到目标上的文件中保留调试符号,而是出于空间原因仅在那里使用剥离的二进制文件。

相反,您可以在 PC 上保持带有完整符号的版本(以及可能还有关联的源),并将调试器指向这些版本。如果您在 PC 上带有调试符号的文件是在远程目标设备上运行的剥离文件的祖先,那么地址匹配并且调试器可以使用这些本地文件来查找远程目标报告的地址的符号。

指向带有调试信息的本地文件是有关“set solib-search-path”或“set sysroot”的提示向您建议的内容,特别是对于您正在调试的程序使用的系统库。通常,您还可以使用要调试的程序的本地副本调用调试器,以便它可以访问程序的符号(甚至可能找到高级源)以及库。

也就是说,这可能与您无关。

首先,调试系统库的内部结构很少有趣,除非您怀疑那里有问题。相反,有趣的是应用程序使用系统库的方式,即它进行的调用和获得的结果(通过ltrace拦截运行可能获得的相同信息

因为动态链接符号即使在剥离的可执行文件中仍然存在,一个好的调试器在正确配置时可以解码动态链接符号和过程链接表 (PLT) 并识别正在调用的动态库函数,即使您没有其他符号或源系统库或程序。