You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SPWN/Pwntools运行baskin二进制时遭遇ld.so断言失败问题

运行ELF二进制文件时libc加载不一致问题排查

问题详情

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 16:17:15