■ x86のNOP命令(0x90)による駄洒落(作者:坂井弘亮)
以下はx86の実行ファイルの機械語コード部分のダンプである.
31 ED 55 89 E5 83 E4 F0 8D 45 08 83 EC 04 50 FF 1.U......E....P. 75 04 52 E8 08 00 00 00 CC*90*90*90**90*90*90*90* u.R............. *55*89*E5 57 56 53 83 EC 0C 8B 75 0C 8B 5D 10 85 U..WVS....u..]..
関数の末尾(CC以降)が,NOP(90)で埋められており,90 90 90 90 90 90 90 という
部分が見られる.
これは命令が無いために,CPUが命令を「くれ,くれ,くれ,...」と言っている.
そしてその後には,関数の先頭に push %ebp と mov %esp, %ebp の前半の「55 89」が
あり,「ゴー!ゴー!ハック!」と言って関数が開始されている.
(この駄洒落の面白い点の解説)
関数末尾のキャッシュアラインのためのパディングのNOPでCPUがやることが無くて
「命令をくれくれくれ...」と言っており,さらにようやく関数先頭で命令を得て,
「ゴー!ゴー!ハック!」と嬉しそうに実行を開始している点が,CPUの挙動と感情を
うまく掛け合わせて表現しており,
そこがこの駄洒落の面白いところです
■ Linux/x86のシステムコール呼び出し(int 0x80: CD 80)による駄洒落(作者:坂井弘亮)
以下はx86の実行ファイルの機械語コードの,システムコール呼び出し部分のダンプ である.
5C 24 14 8B 44 24 10 52 51 53 50 8B 44 24 10 F8 \$..D$.RQSP.D$.. *CD*80*73 07 83 F8 00 7E 02 F7 D8 5B 5B 5B 5B 5B ..s....~...[[[[[ 5B 59 5A C3 83 EC 18 FF 74 24 1C E8 A0 FF FF FF [YZ.....t$......
システムコール呼び出しが int 0x80 で行われており,「CD 80」となっている.
これは,機械語コードのダンプなど見ずに「Cでやれ」と言っている.
(この駄洒落の面白い点の解説)
Linux/x86のシステムコール呼び出し手順(ABI)を知るためにせっかく機械語コードの
ダンプを見ているのに,そのCPUに「C(言語)でやれ」と逆にツッコミを受けてしまって
いる点が,この駄洒落の面白いところです
■ ICMP Echo のパケットによる駄洒落(作者:坂井弘亮)
以下は ICMP Echo のパケットの例である.
00 66 77 88 99 AA 00 11 22 33 44 55 *08*00*45 00 .fw..... "3DU..E. 00 54 11 20 00 00 40 01 E6 35 C0 A8 01 01 C0 A8 .T. ..@. .5...... 01 02*08*00* 22 18 A7 04 00 00 53 9B 9F 77 00 06 ...."... ..S..w.. 50 C7 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 P....... ........ 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 ........ .. !"#$% 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 &'()*+,- ./012345 36 37 67
IPパケットのため,Ethernetヘッダのタイプが「08 00」となっている.
またICMPヘッダのタイプとコードも「08 00」となっている.
これは ICMP Echo のため,受信したノードが「おや,俺?」と反応している
からである.