一个能自己启动的 ZIP:既能解压又能当引导扇区
来源:goliath32.com — 2026-11-14
📋 概述
作者让一个普通 ZIP 归档自己启动:把 BIOS 引导签名塞进归档头部,让 ZIP 本地文件头的字段同时充当合法 8086 机器码——PK 两个字母恰好是有效操作码,再把跳转指令藏进 DOS 时间戳字段,用压缩方法字段的最高位「吃掉」多余字节。整段 16 位实模式代码只有 817 字节,负责查询磁盘几何、把剩余归档载入高位内存、切进 32 位保护模式,最后交给 Multiboot。
🔑 核心要点
- ZIP 从尾部读、中央目录指回文件头,于是「文件前面塞点别的」是格式允许的行为,polyglot 的空间就在这里。
- 现代实现为了安全改成从前往后线性扫描,要求文件以本地文件头开头且没有空洞,反而让自启动 ZIP 变成一道设计题。
- 难点在于 Magic 不能改、版本号与 OS ID 的组合大多不合法,于是把 jmp 塞进 DOS 时间戳 字段。
- 压缩方法字段的最高位是 PKWARE 保留位,对 stor 方法含义未定义,正好用来消耗掉会写内存的剩余字节。
- 817 字节里含 ZIP 头、Multiboot 头与 GDT,作者在 QEMU、软盘、i486 DX2 和 Am386DX-40 真机上都验证过。
💡 金句
The puzzle exercise now becomes, filling the header fields with values that make sense but also happen to be valid 8086 opcodes.
← 返回 Lobsters 首页
👍 0
👎 0