调试旧版本的 libc

逆向工程 小精灵
2021-07-05 03:05:56

我试图更好地理解堆利用。因此,我编译了以下文件:https : //github.com/shellphish/how2heap/blob/master/glibc_2.25/fastbin_dup_into_stack.c

我有最新的libc。如何使用旧版本调试以下文件?我知道我可以尝试将其编译为较旧的,但在我看来这是一项非常艰巨的任务。我试图通过使用 pwntools 从 libc.blukat.me 下载一个旧的 libc,但它没有看到它。

编辑:目标 cpu arch 是 x86 64 位。谢谢!

2个回答

您可能希望设置LD_LIBRARY_PATH为指向您拥有其他 libc 版本的位置。

您可能还需要将其重命名为例如“libc.so.6”。您可以看到二进制文件加载的确切名称ldd

$ ldd /bin/sh
    linux-vdso.so.1 =>  (0x00007fff107d8000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fde26974000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fde26f66000)

您可以验证您的环境变量是否以相同的方式工作。例如,如果您将 libc 复制到/home/pwntools,您可能会看到:

$ LD_LIBRARY_PATH="$PWD" ldd /bin/sh
    linux-vdso.so.1 =>  (0x00007ffda30f5000)
    libc.so.6 => /home/pwntools/libc.so.6 (0x00007f7b26225000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f7b26817000)

libc版本绑定到相应的ld.so(动态链接器)版本。您有几个选择:

  • 在具有与目标 libc 对应的操作系统的 Docker 容器中运行该程序。(例如,docker run -it -v $(pwd):/run ubuntu:20.04 /run/binary)。这样做的好处是,如果您的二进制文件依赖于任何其他系统库,您可以通过apt或类似的方式获得正确的版本
  • 从兼容版本或 libc 包(例如https://packages.ubuntu.com/focal/amd64/libc6/download)中提取ld.so并运行类似.libc.soLD_PRELOAD=./libc.so ./ld.so ./binary

请注意,如果您使用 alibc而不使用相应的ld.so(例如,如果您使用LD_LIBRARY_PATH=. ./binary并且libc目录中的 与您的 system 不匹配ld.so),您可能会遇到段错误或意外行为,因为libcld.so使用在版本之间更改的共享数据结构。