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がいるんじゃね?