池袋バイナリ勉強会(2)に参加してきました
9月23日(日)に池袋バイナリ勉強会(2)に参加してきました。
MonoDevelopでHello world!
MonoDevelopとGTK#を用いて、ボタンをクリックしたらメッセージダイアログを表示するGUIプログラムを書きました。
- MonoDevelopをインストールします。MonoDevelopからダウンロード出来ます。
- Gtk# 2.0プロジェクト新規作成。
- ウィンドウにボタンを配置して、イベントハンドラに"World!"とメッセージダイアログを表示するコードを記述します。
protected void OnButton3Clicked (object sender, EventArgs e) { var md = new MessageDialog(this, DialogFlags.Modal, MessageType.Info, ButtonsType.Ok, "World!"); md.Run (); md.Destroy (); }
ボタンを押すと、以下のようにメッセージダイアログが表示されます。
躓いたところ:
- なぜかぼくのMacBook(OS X 10.8.2)では、MonoDevelop(バージョン 3.0.4.7)上で縦棒「|」を入力すると、MonoDevelop上では閉じ括弧「}」が入力されてしまう問題が発生しました。別のMacを使っている方は問題ないようでした。原因わからず……。
GUI Brainf*ckインタプリタの作成
次にMonoDevelopでGUI Brainfckのインタプリタを作りました。Brainfckのコマンド(> < + - . , [ ])をそれぞれボタンに割り当てて、ボタンを押すとそのコマンドが実行されるGUIプログラムです。
- 資料にしたがってGTK#でGUIを組み立てていきます。手順ごとの説明が分かりやすく、最後までつまることなく出来ました。ウィジェットを配置するたびに、その都度テストして動作確認する仕組みになっているので、もし間違っていればその段階で気づくことが出来るようになっています。
GUIが完成したら、次の命令を実行して動作確認しました。
+++++++++[>++++++++<-]>.
ボタンをポチポチ押して、上のプログラムを実行すると H が出力されたらOKです。
PythonでBrainf*ck
次にPythonでBrainf*ckインタプリタを作りました。
プログラム完成後、Hello world!と出力するbrainf*ckプログラムを実行して動作確認。それから勉強会に参加している方からサンプルコードをいただいてその動作確認もしました(ファイルを下さった方のお名前が分かりません。すみません)。
作成したスクリプトは以下です。
PDP-11にチャレンジ
次にPDP-11のバイナリ解析に取り組みました。
などを行いました。
はじめに id:n7shi さんのブログのコマンドライン版インタプリタから開発環境をインストールします。
Cソースを作成します。
main() { printf("hello\n"); }
v6cc
でコンパイルすると、a.outが生成されます。fileコマンドでa.outを調べると、PDP-11のバイナリであることが確認できます。
$ v6cc hello.c $ file a.out a.out: PDP-11 executable not stripped
実行するには、v6runコマンドを使います。
$ v6run a.out hello
pdp11-aout-objdump
コマンドで逆アセンブルします。
$ pdp11-aout-objdump -d a.out a.out: ファイル形式 a.out-pdp11 pdp11-aout-objdump: a.out: ファイルが途切れています
実行すると、上のように「ファイルが途切れています」と表示されます。これは、a.outに含まれるデバッグ情報、シンボル情報の形式が、pdp11-aout-objdump
で扱えないためです。そのため、v6strip
でこれらの情報を削除します。
$ v6strip a.out
再びpdp11-aout-objdump
を実行すると、今度は逆アセンブル結果が表示されます。
$ pdp11-aout-objdump -d a.out a.out: ファイル形式 a.out-pdp11 セクション .text の逆アセンブル: 00000000 <.text>: 0: f009 setd 2: 1180 mov sp, r0 4: 1226 mov (r0), -(sp) 6: 0bd0 tst (r0)+ 8: 1036 0002 mov r0, 2(sp) c: 09f7 0008 jsr pc, 0x18 10: 100e mov r0, (sp) 12: 09df 024a jsr pc, *$1112 16: 8901 sys 1 18: 0977 0238 jsr r5, 0x254 1c: 15ce 0270 mov $1160, (sp) 20: 09df 0028 jsr pc, *$50 24: 0077 023a jmp 0x262 28: 0977 0228 jsr r5, 0x254 2c: e5c6 007e sub $176, sp 30: 1d77 0004 027c mov 4(r5), $0x2b2 36: 1144 mov r5, r4 38: 65c4 0006 add $6, r4 3c: 9fc0 0272 movb *$0x2b2, r0 40: 0309 beq 0x54 42: 0ab7 026c inc $0x2b2 46: 2017 0025 cmp r0, $45 4a: 0306 beq 0x58 4c: 100e mov r0, (sp) 4e: 09df 01da jsr pc, *$732 52: 01f4 br 0x3c 54: 0077 020a jmp 0x262 58: 0a37 0258 clr $0x2b4 5c: 0a37 0258 clr $0x2b8 60: afd7 024e 002d cmpb *$0x2b2, $55 66: 0204 bne 0x70 68: 0ab7 0246 inc $0x2b2 6c: 0ab7 0244 inc $0x2b4 70: 08f7 0128 jsr r3, 0x19c 74: 1077 0238 mov r1, $0x2b0 78: 0a37 023a clr $0x2b6 7c: 2017 002e cmp r0, $56 80: 0204 bne 0x8a 82: 08f7 0116 jsr r3, 0x19c 86: 1077 022e mov r1, $0x2b8 8a: 1183 mov sp, r3 8c: 65c3 0004 add $4, r3 90: 15c1 0278 mov $1170, r1 94: 1442 mov (r1)+, r2 96: 03da beq 0x4c 98: 2011 cmp r0, (r1)+ 9a: 02fc bne 0x94 9c: 004a jmp (r2) 9e: 1501 mov (r4)+, r1 a0: 0405 bge 0xac a2: 0b01 neg r1 a4: 95d3 002d movb $55, (r3)+ a8: 0101 br 0xac aa: 1501 mov (r4)+, r1 ac: 09f7 0002 jsr pc, 0xb2 b0: 0152 br 0x156 b2: 0a00 clr r0 b4: 7217 000a div $12, r0 b8: 1066 mov r1, -(sp) ba: 1001 mov r0, r1 bc: 0302 beq 0xc2 be: 09f7 fff0 jsr pc, 0xb2 c2: 1580 mov (sp)+, r0 c4: 65c0 0030 add $60, r0 c8: 9013 movb r0, (r3)+ ca: 0087 rts pc cc: 9513 movb (r4)+, (r3)+ ce: 0201 bne 0xd2 d0: 0ac3 dec r3 d2: 9513 movb (r4)+, (r3)+ d4: 0240 bne 0x156 d6: 0ac3 dec r3 d8: 013e br 0x156 da: 1dc1 01da mov $0x2b8, r1 de: 0a03 clr r3 e0: 1302 mov (r4), r2 e2: 8bd2 tstb (r2)+ e4: 0302 beq 0xea e6: 0a83 inc r3 e8: 7e44 sob r1, 0xe2 ea: 1502 mov (r4)+, r2 ec: 0138 br 0x15e ee: 15c2 02a0 mov $1240, r2 f2: 0102 br 0xf8 f4: 15c2 02a4 mov $1244, r2 f8: 1501 mov (r4)+, r1 fa: 0305 beq 0x106 fc: 0bf7 01b8 tst $0x2b8 100: 0302 beq 0x106 102: 95d3 0030 movb $60, (r3)+ 106: 0a00 clr r0 108: 09f7 0002 jsr pc, 0x10e 10c: 0124 br 0x156 10e: 1066 mov r1, -(sp) 110: 760a ashc (r2), r0 112: 0302 beq 0x118 114: 09f7 fff6 jsr pc, 0x10e 118: 1580 mov (sp)+, r0 11a: 4c80 0002 bic 2(r2), r0 11e: 65c0 0030 add $60, r0 122: 2017 0039 cmp r0, $71 126: 0702 ble 0x12c 128: 65c0 0007 add $7, r0 12c: 9013 movb r0, (r3)+ 12e: 0087 rts pc 130: 1dc0 0184 mov $0x2b8, r0 134: 1dc2 017e mov $0x2b6, r2 138: 09f7 0094 jsr pc, 0x1d0 13c: 010c br 0x156 13e: 1dc0 0176 mov $0x2b8, r0 142: 1dc2 0170 mov $0x2b6, r2 146: 09f7 0086 jsr pc, 0x1d0 14a: 0105 br 0x156 14c: 1504 mov (r4)+, r4 14e: 1537 0160 mov (r4)+, $0x2b2 152: 0077 fee6 jmp 0x3c 156: 1182 mov sp, r2 158: 65c2 0004 add $4, r2 15c: e083 sub r2, r3 15e: 1126 mov r4, -(sp) 160: 15e6 0020 mov $40, -(sp) 164: 10c4 mov r3, r4 166: 0b03 neg r3 168: 6dc3 0144 add $0x2b0, r3 16c: 0706 ble 0x17a 16e: 0bf7 0142 tst $0x2b4 172: 0203 bne 0x17a 174: 09df 01da jsr pc, *$732 178: 7ec3 sob r3, 0x174 17a: 0bc4 tst r4 17c: 0304 beq 0x186 17e: 948e movb (r2)+, (sp) 180: 09df 01da jsr pc, *$732 184: 7f04 sob r4, 0x17e 186: 0bc3 tst r3 188: 0705 ble 0x194 18a: 15ce 0020 mov $40, (sp) 18e: 09df 01da jsr pc, *$732 192: 7ec3 sob r3, 0x18e 194: 0bd6 tst (sp)+ 196: 1584 mov (sp)+, r4 198: 0077 fea0 jmp 0x3c 19c: 0a37 0116 clr $0x2b6 1a0: 0a01 clr r1 1a2: 9fc0 010c movb *$0x2b2, r0 1a6: 0ab7 0108 inc $0x2b2 1aa: e5c0 0030 sub $60, r0 1ae: 2017 fffa cmp r0, $-6 1b2: 0202 bne 0x1b8 1b4: 1500 mov (r4)+, r0 1b6: 0103 br 0x1be 1b8: 2017 0009 cmp r0, $11 1bc: 8206 bhi 0x1ca 1be: 0ab7 00f4 inc $0x2b6 1c2: 7057 000a mul $12, r1 1c6: 6001 add r0, r1 1c8: 01ec br 0x1a2 1ca: 65c0 0030 add $60, r0 1ce: 0083 rts r3 1d0: 65c4 0008 add $10, r4 1d4: 95d3 003f movb $77, (r3)+ 1d8: 0087 rts pc 1da: 1166 mov r5, -(sp) 1dc: 1185 mov sp, r5 1de: 1dc0 00dc mov $0x2be, r0 1e2: 0204 bne 0x1ec 1e4: 09f7 002c jsr pc, 0x214 1e8: 1dc0 00d2 mov $0x2be, r0 1ec: 9d50 0004 movb 4(r5), (r0)+ 1f0: 0307 beq 0x200 1f2: 0ab7 00c8 inc $0x2be 1f6: 0af7 00c2 dec $0x2bc 1fa: 0602 bgt 0x200 1fc: 09f7 0014 jsr pc, 0x214 200: 1d40 0004 mov 4(r5), r0 204: 1585 mov (sp)+, r5 206: 0087 rts pc 208: 1166 mov r5, -(sp) 20a: 1185 mov sp, r5 20c: 09f7 0004 jsr pc, 0x214 210: 1585 mov (sp)+, r5 212: 0087 rts pc 214: 1dc0 00a6 mov $0x2be, r0 218: 030a beq 0x22e 21a: e5c0 02c0 sub $1300, r0 21e: 1037 008a mov r0, $0x2ac 222: 1dc0 0094 mov $0x2ba, r0 226: 0201 bne 0x22a 228: 0a80 inc r0 22a: 8900 sys 0 22c: 02a8 bne 0x17e 22e: 15f7 02c0 008a mov $1300, $0x2be 234: 15f7 0200 0082 mov $1000, $0x2bc 23a: 2dd7 007c 0002 cmp $0x2ba, $2 240: 8203 bhi 0x248 242: 15f7 0001 0074 mov $1, $0x2bc 248: 0087 rts pc 24a: 1166 mov r5, -(sp) 24c: 1185 mov sp, r5 24e: 1d40 0004 mov 4(r5), r0 252: 8901 sys 1 254: 1140 mov r5, r0 256: 1185 mov sp, r5 258: 1126 mov r4, -(sp) 25a: 10e6 mov r3, -(sp) 25c: 10a6 mov r2, -(sp) 25e: 0be6 tst -(sp) 260: 0048 jmp (r0) 262: 1141 mov r5, r1 264: 1844 mov -(r1), r4 266: 1843 mov -(r1), r3 268: 1842 mov -(r1), r2 26a: 1146 mov r5, sp 26c: 1585 mov (sp)+, r5 26e: 0087 rts pc
helloだけでこれだけの長さ……。printfを使うと引数解析などの処理が必要でコードが長くなるそうです。いきなりこれを理解するのは難しいので、最初は以下のアセンブリコードから取り組みました。
mov $1, r0 sys write hello 6 mov $0, r0 sys exit hello: <hello\n\0>
v6as
でアセンブルすると、a.outが生成されます。
$ v6as hello.s $ v6run a.out hello
逆アセンブルします。
$ v6strip a.out $ pdp11-aout-objdump -d a.out a.out: ファイル形式 a.out-pdp11 セクション .text の逆アセンブル: 00000000 <.text>: 0: 15c0 0000 mov $1, r0 4: 8904 sys 4 6: 0010 .word 20 8: 0006 rtt a: 15c0 0000 mov $0, r0 e: 8901 sys 1 10: 6568 add (r5)+, *-(r0) 12: 6c6c 0a6f add 5157(r1), *-(r4) …
hello.sには含まれない命令(addなど)が表示されていますが、これは文字列データ(hello)が命令と見なされるため、上のように表示されるのだそうです。
オペコード、レジスタなど他にもいろいろ教えていただきました。自分の中であまり整理と理解が出来ていないので、箇条書きでメモしておきます。
バイナリ形式
a.outが出来るまで
.cファイル(C言語) --> .sファイル(アセンブリ言語) --> .o(オブジェクトファイル) --> a.out コンパイル アセンブル(as) リンク(ld)
.sから逆アセンブリまでのコマンドを一気に実行
v6as hello.s && v6strip a.out && pdp11-aout-objdump -d a.out
v6src/s5/write.sのソース
/ C library -- write / nwritten = write(file, buffer, count); / / nwritten == -1 means error .globl _write, cerror _write: mov r5,-(sp) mov sp,r5 mov 4(r5),r0 mov 6(r5),0f mov 8(r5),0f+2 sys 0; 9f bec 1f jmp cerror 1: mov (sp)+,r5 rts pc .data 9: sys write; 0:..; ..
更新履歴:
- (2012-10-28): hello.sのコードを修正しました。
- (2012-12-02): gistを貼り付けました(bf.py)