a.out で 63Byte Hello, world!

a.out だったら小さくなるかも、って質問に答えたんですが、 a.out ってファイル内オフセットを指定できないから、ヘッダの空間使えないみたいで、たぶんこんなくらいで限界ぽいというかつまらない…

i@u ~/wrk/binhacks> ls -l hello_aout
-rwxr-xr-x 1 i i 63 2006-11-17 05:05 hello_aout*
i@u ~/wrk/binhacks> file hello_aout
hello_aout: Linux/i386 pure executable (NMAGIC), stripped
i@u ~/wrk/binhacks> ./hello_aout
Hello, world!

まぁ、 ELF の 58B の方が短いというのは非常にすごいということが再確認できます。

        BITS    32
        ORG     0
        dw      0x108           ; magic
        db      100             ; 386
        db      0
        dd      textsz
        dd      0
        dd      0
        dd      0
        dd      entry - text
        dd      0
        dd      0
text:
        db      "Hello, world!", 10
entry:
        lea     ebx, [eax+1]
        xor     ecx, ecx
        lea     edx, [eax+14]
        mov     al, 4
        int     0x80
        mov     al, 1
        dec     ebx
        int     0x80
textsz  equ     $ - text

ヘッダ 32B で Hello が 14B で実行コードが 17B 。いくつかどうでもいい知識が身につきました。だいたい a.out なんて私が Linux 触りはじめた時には駆逐されてたしなぁ…

  • a.out はヘッダ→ .text → .data → .bss → relocation関係 と並んでいるだけのえんらい単純なデータ
  • Hello, world!\n はどこを取っても実行コード扱いしてもうまくいかない気がする。
  • a.out で実行すると EAX 以外のレジスタが 0 クリアされてない(だから実行サイズが17Bもある)。
なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h