kik さんが簡単だとおっしゃってたので書いてみました。
i@u ~/wrk/binhacks> ls -l quine_small -rwxr-xr-x 1 i i 56 2006-11-16 22:41 quine_small* i@u ~/wrk/binhacks> diff =(./quine_small) ./quine_small i@u ~/wrk/binhacks>
すごそうに見えますが、実はこれは簡単すぎてつまらない…
mov al, 4 ; write = 4 inc ebx ; stdout = 1 mov dl, filesize ; strlen int 0x80 xchg eax, ebx ; exit = 1 xchg ebx, ecx ; exit(0) int 0x80
みたいなコードを magic の下に埋めてやれば 58B => 56B に簡単にできます。命令的にはスカスカですが、 56B がヘッダの位置的にバイナリサイズの限界です。
一応もっと深く ELF ヘッダとプログラムヘッダを重ねるのを検討したのですが、どうにも無理だと私は判断。一応実行開始までいけるパターンはあるんですが。