2001年,德国现场乐队Farbrausch发布了一个名为“fuenf”(在你脸上)的演示。 pouet.net 它包含一个 5 字节的可执行文件,与其说是演示,不如说它是一种巨魔方法。如果您运行它,您会听到奇怪的声音,并且可能会使您的计算机崩溃。至少它能发出声音。无论如何。
十六进制内容为:
95cd 21eb fc
二进制表示为:
10010101 11001101 00100001 11101011 11111100
使用 xxd 我还从内容中获取可打印字符,它们是:
..!..
这让我有点困惑。查找 ASCII 表中的值(例如此处),我得到以下结果:
•Í!ëü
至少感叹号是正确的。
但是95cd21ebfc如何翻译成..!..?
旁注:
file -bi fuenf.com 表示编码未知:
charset=unknown-8bit
并且 iconv -f ISO-8859-1 -t UTF-8 fuenf.com 返回
Í!ëü
这导致了这样的假设:XXD 根本无法解码内容,因此只使用默认结果,例如点?
首先,这不是一个文本文件,因此将其视为文本文件是没有意义的。这是说明。
其次,即使它可以解释为文本,您也需要知道编码。它绝对不是 ASCII,因为它只定义 0-127 范围内的符号(这里的第三个字节是该范围内的唯一一个,映射到“!”)。您链接到的“扩展 ASCII”表只是为 128-255 之间的值赋予含义的许多可能的代码页之一,但这些代码页有很多。称其为“扩展 ASCII”是一种误导,因为它表明 ASCII 为此创建了更新的标准,但事实并非如此。有一段时间,计算机供应商只是对这些附加字符为所欲为,其中一些由于被包含在 DOS、Windows 等中而成为准标准。或者它们被 ISO 标准化(你尝试过 iso-8859-1 ,这是一个这样的标准)。
这是一个 MS-DOS 演示。没有标题 - 文件直接包含代码。
拆解为:
0: 95 xchg ax,bp
1: cd 21 int 0x21
3: eb fc jmp 0x1
int 0x21
调用 MS-DOS 操作系统功能。 哪个功能由ah
寄存器(ax
的上半部分)决定。 在大多数版本的 DOS 上 ah
开始时包含数字 0。DOS 函数 0 结束程序。那会很无聊。
因此,我们将其替换为一个更有趣的寄存器,根据同一张表,其上半部分通常包含 9。 INT 0x21 函数 9 将字符串打印到屏幕(参见 Ralf Brown 的中断列表)。哪个字符串?没有足够的字节来决定一个,所以无论发生什么,都已经被偶然设置了。在 MS-DOS 中,你不能通过读取无效的内存地址来使程序崩溃,因此它会打印某种垃圾,直到它偶然找到字符串结尾标记。
然后重复。
声音可能是由字符串碰巧包含(偶然)ASCII 响铃字符引起的 - 这是早期打字机的遗物,它带有实际的响铃,因此当程序完成时计算机可以响铃。 MS-DOS 可能通过蜂鸣声模拟了这一点。