本文根据 tmp.0ut 第五期中 Binary Golf Association 的文章编译整理,非逐字翻译;文中观点均属于原作者。

原文:BGGP6 Recap

文章内容来自 tmpout.sh,本译文依原站 CC BY-NC-SA 4.0 许可作为改编内容发布。如有侵权请通知,我会下架文章。 全文字符数:3220

引言

今年(BGGP6)的主题是 RECYCLE:让参赛者探索往年 BGGP 挑战的各种组合;作品每满足一项 BGGP 挑战标准就额外加分。参赛者也可以选择最简单的路线:找出能以某种方式打印或显示数字 6 的最小东西。

按挑战统计,今年共有 36 份作品:

挑战 作品数
1 Palindromes(回文) 6
2 Polyglots(多格式) 15
3 Crashes(崩溃) 8
4 Self Rep(自复制) 11
5 Download(下载) 16
6 Print 6(打印 6) 33

1. 回文

回文文件是 BGGP 的第一个挑战,也是最难的之一,需要作者做到字节级精确。6 份作品是回文,其中包括 BGGP6 得分最高的几份。mattpass 的 5 字节 shell 脚本展示了优雅的回文加载器——利用命令行参数执行额外代码;dominikr 的 ELF/COM 多格式回文作品还因在赛期内合并了修复 bug 的 PR 而获得加分。

大小 作者 类型 BGGP 得分 Issue
0223 dominikr ELF COM 1 2 3 4 5 6 6433 170
0179 mattpass .sh, .sql, .zip 1 2 3 4 5 6 5453 165
0005 mattpass .sh 1 . . . 5 6 4859 151
0055 mauke COM, .pl, .sh, Make 1 2 . . . . 4553 146
0472 xcellerator ELF, DICOM Image 1 2 . . . 6 4392 167
0228 febnug ELF 1 . . . . 6 4380 157

2. 多格式

15 份作品满足 BGGP2 多格式挑战标准。自 BGGP2 以来,多格式已成为 BGGP 作品的常见特征。单份作品包含文件类型最多的是并列 4 种:deluks 做了 ELF、PDF、RAR、Zip 多格式;mauke 做了 COM、Make、Perl、Shell 多格式,而且它同时也是回文!按文件类型分布(COM、deb、DICOM、ELF、js、make、pbm、pdf、pl、ps1、rar、sh、sql、txt、zip 等均有出现),更多信息见仓库的 polyglot 板块。

3. 崩溃

8 份作品满足 BGGP3 崩溃挑战标准。最小的是 q3w3e3 的 24 字节 shell 脚本;第二小还是 q3w3e3 的 26 字节 shell/Perl 多格式;第三小仍是 q3w3e3 的 44 字节 shell/Perl 多格式。

  • q3w3e3 找到多种让 curl 崩溃的方式:sh 24 字节(169)、sh/pl 26 字节(171)、sh/pl 44 字节(172);
  • dominikr 有 3 个崩溃作品:perl 29 字节(168)、无 CLI 参数的 elf32 154 字节(177)、elf/com 223 字节(170);
  • bah 用 126 字节通过 inputrc 按键绑定让 bash 崩溃(166);
  • mattpass 的 179 字节 Shell/Zip 多格式在满足全部 6 项挑战的同时把自己搞崩了(165)。

4. 自复制

11 份作品满足 BGGP4 自复制挑战标准。最小前三名再次都是 q3w3e3:24 字节 shell、26 字节 shell/Perl 多格式、44 字节 shell/Perl 多格式。

  • bah:curlrc 62 字节(154)、inputrc 126 字节(166);
  • dominikr:带 CLI 参数的 elf32 45 字节(174)、无 CLI 参数的 elf32 154 字节(177)、deb/sh 182 字节(175;原页另一节写作 223 字节,两处不一致)、elf/com 223 字节(170);
  • ilya:elf/pdf 512 字节(180);
  • mattpass:sh/zip 179 字节(165);
  • q3w3e3:三个 sh/pl 作品(169/171/172)。

5. 下载

16 份作品满足 BGGP5 下载挑战标准。最小的是 mattpass 的 5 字节 shell 脚本(用 CLI 参数);不带 CLI 参数的最小是 q3w3e3 的 24 字节 shell 脚本。

  • bah:curlrc 62 字节(154)、inputrc 126 字节(166);
  • dominikr:带参数的 elf32 45 字节(174)、无参数 elf32 71 字节(173)、自定义编译器构建的 elf32 154 字节(177)、tar 148 字节(178)、deb/sh 223 字节(175)、elf/com 223 字节(170);
  • febnug:elf64 1696 字节;
  • mattpass:带参数的 sh 5 字节(151)、sh/zip 179 字节(165)、sh/sql/zip 159 字节(164);
  • q3w3e3:三个 sh/pl 作品(169/171/172);
  • x0:带参数的 sh 86 字节(155)。

6. RECYCLE / 打印 6

33 份作品满足 BGGP6 主挑战——用尽量小的作品打印 6。这是最受欢迎的赛道,具体作品请直接查看仓库。

特别致谢

没见过的文件类型

每年参赛者都会探索 BGGP 里没出现过的文件类型:

  • curlrc:bah 的作品展示如何用 curlrc 执行命令;
  • DICOM:xcellerator 把 DICOM 医学图像与 RISC-V ELF 结合;
  • erofs:bilger 利用空闲空间在 base64 里加入了漂亮图案;
  • inputrc:bah 又带来一个能把命令注入 bash 的有趣 rc 文件;
  • NetPBM:ackmage 研究 NetPBM 格式变体,做了在 macOS 上工作的多格式;
  • Python Pip:dtm 展示了 pip 包一些只能形容为“纯邪恶”的能力;
  • RDOFF:netspooky 复活了 nasm 使用过的失落目标文件格式;
  • Wireshark Dissector:netspooky 做了一个不断刷 6 的又小又烦人的解析器。

最酷的视觉 payload

  • bilger 的 EROFS base64 里用 “6” 拼出了 “BGGP” 字样(原页有完整 ASCII 图案);
  • x0 的加载器与 xcel 的 DICOM 作品见仓库。

最受诅咒的代码

OwOday 的作品充分展示了 6 的力量:用一堆宏把 AArch64 机器码硬编码出来,只靠数字 6 及其算术组合构造每个 .inst(例如 0xd28000200x100000c10xd2800042 等),内联汇编定义一个 __6 标签并打印 "6\n",最后 main 调用它并返回 ssssss6(即 0)。完整宏清单见原页。

最小四强

最小作品由 int0x80 与 squiblydoo 并列第一,都是 1 字节。squiblydoo 还证明单字节 “6” 本身是合法 PowerShell 脚本,额外拿下 256 分打破平局。continue 的 Forth 作品只有 3 字节,展示了用 Forth 打印的最小方式;mattpass 的 5 字节 shell 则是优雅的回文加载器。

大小 作者 类型 BGGP 得分 Issue
0001 squiblydoo .ps1, .txt . 2 . . . 6 4351 153
0001 int0x80 .txt . . . . . 6 4095 145
0003 continue .forth . . . . . 6 4349 150
0005 mattpass .sh 1 . . . 5 6 4859 151

最高分三强

dominikr 的 ELF/COM 多格式得分最高:满足全部 6 项 BGGP,还因在赛期内合并了修复 radare2 ELF bug 的 PR 而加分。mattpass 的 Shell/SQL/ZIP 多格式同样满足全部 6 项挑战。

大小 作者 类型 BGGP 得分 Issue
0223 dominikr ELF COM 1 2 3 4 5 6 6433 170
0179 mattpass .sh, .sql, .zip 1 2 3 4 5 6 5453 165
0026 q3w3e3 .sh, .pl . 2 3 4 5 6 5350 171

结语

感谢今年所有提交 BGGP 作品的参赛者!全新的 binary.golf 网站将于今年晚些时候上线。也感谢所有帮忙分诊作品、为 BGGP6 造势的人。社交账号:@binarygolf(twitter)、@binary.golf(bsky)、@binarygolf@haunted.computer(fedi)。

Peace,netspooky // Binary Golf Association


上一页:RDOFF 病毒:重访一种冷门目标文件格式

下一页:x86-64 Linux ELF 的细粒度加载时 ASLR