Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PE(exe)ファイルのRev問を解いてみよう<公開版>

Xcyba17her
August 10, 2019

 PE(exe)ファイルのRev問を解いてみよう<公開版>

Xcyba17her

August 10, 2019
Tweet

More Decks by Xcyba17her

Other Decks in Technology

Transcript

  1. 目次  問題解説  Binary 2 (NeverLAN CTF 2019) 

    Crack me (InnoCTF 2019)  Left 5 Seconds (Victor of Cyberists)  Gacha (Victor of Cyberists)  完全版ではksnctfの3問のWriteupと,問題ファイルやソルバを 用意しています.色々と考慮すべきことがあるので,完全版の 配布はTwitter DMにより個人的に行うことにします.  完全版からksnctfの部分のwriteupを抜いただけなので,ツー ルのある機能の説明が省かれているにもかかわらず,その後の 問題で既知の機能として扱われている可能性があります. 2
  2. IDA Freewareで眺める  読むのが非常に面倒くさい…  さらに関数を呼んでいる  デバッグしてみよう  Strという第一引数に”_”を

    指定していることから入力に おける”_”に関する関数と 予想  デバッグ時には入力文字列に “_”を含ませてみる 21
  3. sub_403310の返り値を検証する  “_”の入力の有無や位置を変えて返り値(eax)の変化を調べる  “_”を入れないとeaxは0xffffffff(=-1)に,入れると”_”のイン デックスがeaxに入ることがわかる  関数直前には入力文字列へのポインタがecxに格納されるため,入 力文字列も扱う関数だと予想できる 

    sub_403310は,指定文字列から指定文字か文字列を検索しイン デックスを返し,見つからなければ-1を返す,strstrのような 関数だと予想できる  分岐前に返り値(eax)が0xffffffffならwrong_exitに移動するこ とになっていた  入力文字列に”_”が含まれていればwrong_exitに移動しない! 26
  4. 8つめの分岐を調べる  ごめんなさい,これは完全に勘です(m´・ω・`)m  実は,sub_403090を通るとeaxには入力文字列の12~15文字目を前に3 だけシフトした文字列が入る  例えば,入力の12~15文字目が”abcd”だと返り値eaxには”^_`a”が 入る 

    では,入力の12~15文字目を前に3だけシフトして”fine”だったら いい,すなわち”ilqh”だったらいいのではと考えた  これでだめだったら諦めるか地道に読んでいくつもりだった 35
  5. dnSpyでプログラムを書き換える  dnSpyでは,逆コンパイルしたソースコードを書き換えて再コン パイルすることができる!  if (this.time_count == 500)をif (this.time_count

    == 50000)に書き換えたい  ソースコード上で左クリック → Edit Method → 該当部分を書き換 える → 右下のCompileボタン → ソースコード画面のFile → save All… → left_five_seconds_edited.exeなどと保存 40
  6. 別解  Form1.Button_Clickといういかにもボタンが押されたら呼ば れそうな関数がある  さて,プログラムが終了してしまう条件は,time_countが500 を超えてしまうことだった  つまり,Form1.Button_Clickにブレークポイントを置いて実 行し,ボタンを押す

    → プログラムがブレークポイントで一時停 止する → time_countの値を編集して0に戻す → プログラムを 進めるというのを繰り返せば解ける  time_countはunsignedの変数のようであり,負数には設定できな い.つまり,プログラムを動かしてボタンを押すまでを5秒でやら なければいけないので少し不安があり,そして30回もやるのはめん どくさい 49
  7. 未知数検索  まずScan Typeを”Unknown Initial Value”,Value Type を”4 Bytes”にし,First Scanをクリック

     以降は,ガチャを引いた後,Scan Typeを”Changed Value”と してNext Scanをすることを繰り返す  残念ながらこの方法では絞り込めない 56
  8. 特定の値の配列の検索(1byte単位)  配列の各要素が1バイトである場合と4バイトである場合の2通り で検索してみる.まずは1バイト単位で検索  New Scan → Value Type:

    Array of Byte → Valueのテキス トボックスに”00 01 01 01 01 00 00 00 01 00 01 01”を入 力 → 全てのメモリを調べるためにWritable, Executable, CopyOnWriteのチェックを全て▪にする → First Scan  しかし結果は1件もない 58
  9. 特定の値の配列の検索(4byte単位)  New Scan → Value Type: Grouped → Valueのテキストボッ

    クスに”4:0 4:1 4:1 4:1 4:1 4:0 4:0 4:0 4:1 4:0 4:1 4:1”を入力(4:0は4バイトの値が0の意) → 全てのメモリを調べ るためにWritable, Executable, CopyOnWriteのチェックを 全て▪にする → First Scan  1件だけ結果が出る 59