极简 ELF 探险:合规前提下能压到多小?

极简 ELF 探险:合规前提下能压到多小?

_

在 Linux 上折腾「最小可执行文件」的极客圈子里,有个叫 breadbox 的老手。他的经典作品是一枚 45 字节的 ELF 文件——小到连 Linux 内核都「误以为」它是合法的可执行文件。严格来说,它确实不符合 ELF 规范。于是他写了续篇,打算在标准合规的前提下,把文件再往小了压。

从 91 字节起步

在走向「不规范」的歧途之前,有一个 91 字节的版本是严格遵守规范的。这个版本把 ELF 文件头(Ehdr)和程序头表(Phdr)分开存放。breadbox 注意到规范其实允许不同数据结构之间重叠——于是他让 Ehdr 和 Phdr 互相覆盖 8 个字节,直接砍到 83 字节。

四个「废弃」字节的妙用

大多数 ELF 头字段在 Intel 架构的可执行文件里根本用不上,规范要求清零。但有一个例外:p_paddr 字段。规范说它的内容是「未指定」的——换句话说,内核根本不在乎里面装什么。breadbox 在这里塞了两条指令:一条短跳转(2 字节),再加上一条 xor eax, eax(同样是 2 字节)。配合后续的 inc eax 和 mov bl, 42 + int 0x80,整套 81 字节的程序完整跑完了「返回 42」这个简单任务。

往地址高位塞代码

再往下还能挤吗?程序头里存着加载地址——通常固定在 0x08048000。但 breadbox 发现,只要保持页对齐,高位地址也可以用。用 mov bl, 42 的字节码 B3 填入地址最高位(0x2AB30000),指令照常执行。这样又把文件体积往下降了一截。整个过程就是这样一点点「钻规范空子」,直到再无字节可删。

这段旅程说明:所谓的「最小」从来不只有一个答案,取决于你在「能用」「合规」「够小」之间怎么取舍。

编注:信源为作者本人网站长文,材料详尽覆盖从 91 字节到 81 字节的完整推导过程,逻辑清晰;原文附有 NASM 汇编源码可供复现。


通义千问发布语言世界模型:让AI学会「模拟真实世界」 2026-06-24
MacBook Neo 光标延迟克星:1像素屏幕录制即可消除卡顿 2026-06-24