使用SPWN/Pwntools运行baskin二进制时遭遇ld.so断言失败问题
问题详情
SPWN日志
[*] Binary: baskin [*] Libc: libc-2.27.so [*] Loader: ld-linux-x86-64.so.2 [*] file baskin ELF 64-bit LSB executable x86-64 dynamically linked not stripped [*] checksec baskin RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x400000) Libc version: 2.27 [+] Trying to unstrip libc [*] Libc unstripped -- ldd of the original binary linux-vdso.so.1 (0x00007fffec961000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fba54613000) /lib64/ld-linux-x86-64.so.2 (0x00007fba54843000) -- ldd of the patched binary linux-vdso.so.1 (0x00007ffdd1f1c000) libc.so.6 => ./debug_dir/libc.so.6 (0x00007f648de00000) ./debug_dir/ld-linux.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007f648e343000)
Pwntools测试代码
from pwn import * p = process('baskin', env={'LD_PRELOAD':'./libc-2.27.so'}) libc = ELF('./libc-2.27.so') p.interactive()
报错信息
Inconsistency detected by ld.so: dl-call-libc-early-init.c: 37: _dl_call_libc_early_init: Assertion `sym != NULL' failed!
当前SPWN和Pwntools均无法搭配指定的libc-2.27.so运行baskin,即使对libc执行unstrip操作,错误依旧存在,环境变量和路径已检查无明显问题。
解决思路
搭配对应版本的动态链接器(ld)
报错根源是仅指定了libc,但未使用与libc-2.27.so匹配的ld-linux-x86-64.so.2,系统默认loader与指定libc版本不兼容导致符号缺失。需将同版本的loader与libc放在同一目录,修改Pwntools代码:from pwn import * # 假设ld-linux-x86-64.so.2和libc-2.27.so在当前目录 p = process(['./ld-linux-x86-64.so.2', './baskin'], env={'LD_PRELOAD': './libc-2.27.so'}) libc = ELF('./libc-2.27.so') p.interactive()确保libc与loader版本匹配
必须使用来自同一系统镜像的libc和loader(如Ubuntu 18.04,其默认libc版本为2.27),避免跨版本组合导致的兼容性问题。可通过readelf -h查看两者的版本信息是否一致。验证libc文件完整性
重新下载对应版本的libc包,通过file命令确认文件信息:file libc-2.27.so正常输出应包含
ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=..., not stripped, version 'GLIBC_2.27'。使用patchelf修改二进制的动态依赖
直接修改baskin二进制,指定其使用自定义的libc和loader,无需依赖LD_PRELOAD:# 设置二进制的动态链接器为指定版本的ld patchelf --set-interpreter ./ld-linux-x86-64.so.2 baskin # 设置运行时库搜索路径为当前目录 patchelf --set-rpath ./ baskin修改完成后直接运行
./baskin即可。调整SPWN的loader配置
从SPWN日志可见,patched binary的loader仍指向系统默认路径/lib64/ld-linux-x86-64.so.2,需将匹配版本的ld-linux-x86-64.so.2放入debug_dir目录,确保SPWN使用指定的loader而非系统默认版本。
内容的提问来源于stack exchange,提问作者user123125

