akkietech’s diary

セキュリティ関連メインの自分用メモ書き。twitter: @akkietech

4/27 CTF -バイナリ解析-

5/25、 26のSECCON Beginners CTF出ることにしたので、
「セキュリティコンテストチャレンジブック」を買った。

とりあえず第1章から進めたので、メモ

※バイナリ解析の章では、「美しき策謀」「コンピュータハイジャッキング」を読んでいたのがすごく役に立っている


■表層解析
使用するコマンド
file

strings
strings -n [文字数] => [文字数]以上の文字列のみを出力

動的解析で使用するコマンド
strace => システムコールの呼び出しを追跡
ltrace => ライブラリ関数の呼び出しを追跡

straceの主なオプション

  • p [pid] すでに実行されているプロセスのをトレースする
  • e [システムコール] 出力するシステームコールを指定する
  • f 子プロセスも含めてトレースする
  • c なんか統計情報を表示


レジスタについて復習

eip 次の命令が格納されているアドレス

esp
・現在スタックが参照しているアドレス
・現在のスタックフレームのトップアドレス

ebp
・実行中関数のスタックの底(ベース)のアドレス
・現在のスタックフレームの底のアドレス

プロローグ
push ebp
mov ebp, esp
関数呼び出し後に、呼び出し元のベースポインタを保存する命令(push ebp)と、関数呼び出し時に生成されるスタックフレームのベースポインタ保存(mov ebp, esp)をプロローグと言うらしい

エピローグ
mov esp, ebp
pop ebp
関数の最後に呼び出し元関数に戻るために、スタックポインタに現在の関数のベースポインタを保存(mov esp, ebp)し、呼び出し元のベースポインタを取り出す(pop ebp)流れをエピローグと言うらし


デバッガでの解析

・とりあえず関数名でブレイクポイント設定

(gdb) b main

・nextiで1命令ごとに進める

(gdb) nexti

・現在のレジスタ値を確認(i r => info registersの省略形)

(gdb) i r
rax            0x555555555178      93824992235896
rbx            0x0                 0
rcx            0x7ffff7fa5718      140737353766680
rdx            0x7fffffffe1f8      140737488347640
rsi            0x5                 5
rdi            0x3                 3
rbp            0x7fffffffe0e0      0x7fffffffe0e0
rsp            0x7fffffffe0e0      0x7fffffffe0e0
-省略-

・スタックポインタから64バイト分を表示

(gdb) x/16wx $rsp
0x7fffffffe0e0:  0xffffe100	 0x00007fff	0x5555518f	0x00005555
0x7fffffffe0f0:	  0xffffe1e0	 0x00007fff	0x00000000	0x00000000
0x7fffffffe100:	  0x555551c0	 0x00005555	0xf7e0e09b	0x00007fff
0x7fffffffe110:	  0x00000000	 0x00000000	0xffffe1e8	0x00007fff

・アドレスが指す文字列をチェックしたい

(gdb) p/s [アドレス]


メモ
exeファイルの解析とかするとなると、windows環境も同時進行で必要??
てことはやっぱりmacbook proがいるんじゃね?