20190826Reversing公開用_修正版

5f9309c6fe879950878bb3d7b039a7b9?s=47 Aqua
August 26, 2019

 20190826Reversing公開用_修正版

5f9309c6fe879950878bb3d7b039a7b9?s=128

Aqua

August 26, 2019
Tweet

Transcript

  1. バイナリの歩き方 条件分岐を飛び越えろ

  2. Self-introduction • Name : 解析魔法少女あくあ(•̀ ᴗ•́ )و • Job :

    Magical girl • Twitter : @WinterLabyrinth • Dream : 異世界転生 • Friend : Malware • Favorite Manga : 王様達のヴァイキング • Favorite Anime : 残響のテロル、幼女戦記
  3. Agenda 1. 本日使用するプログラムの動作確認 2. 使用ツールの確認 3. 逆アセンブリ 4. デバッグ 5.

    バイナリパッチ
  4. Program

  5. Program • 動作 • scanf()でパスコードを入力 • strcmp(buf, pass)で文字列を比較 • 正しい入力だった場合

    ” Correct! :D” と表示する • 間違った入力だった場合 “Incorrect ;(” と表示する
  6. Magical Weapon • IDA Pro (高いが強い。) • Ghidra (無料、強い、デコンパイラ付き) •

    x64dbg • StirlingなどのHexEditor
  7. Disassemble • ”逆アセンブル”とは、機械語で書かれたオブジェクトプログラム を解析して、人間に可読なアセンブリ言語のプログラムに復元す ることをいう。 quoted from weblio

  8. Disassemble

  9. Disassemble • ぶっちゃけた話、見るだけでパスワードわかってしまいます。 >>> '434554'.decode('hex’) 'CET'

  10. Debug • jnzにbreakpointを仕掛ける • RIPをjump先のCorrectへ変更 • Continue

  11. Debug • 間違ったパスワードを入力したにも関わらず“Correct! :D”が表示 された

  12. Probrem • アンチデバッグの可能性もある • IsDebuggerPresentを使用し、PEB fs:[30h]+2が1の場合は デバッガーを検知される可能性がある。 • その他も問題点として難読化等もあります。 •

    そもそもjmpに書き換えればいいのでは? mov eax, 0でいいのでは? • 単純なバイナリでは動作する可能性はありますが、 単にバイト数の問題(後述)や整合性が取れなくなる場合が あります
  13. Binary patch • strcmpの戻り値をtest eax, eaxで比較しています。

  14. Binary patch • test eax, eaxとは? • EAXの値を0と比較してフラグに反映 • xor

    eax, eaxとは? • eaxとeaxの排他的論理和取りeaxに格納 • 同じもの同士の排他的論理和を取ると0になります • jnzとは? • EAXが0以外のときにジャンプします
  15. Assemble • https://defuse.ca/online-x86-assembler.htm test eax, eax Hex : 85 C0

    xor eax, eax Hex : 31 C0
  16. Assemble mov eax, 0 Hex : B8 00 00 00

    00 mov eax, 1 Hex : B8 01 00 00 00
  17. How do you see it? • IDA ProならEdit > Patch

    program > Change byte • test eax, eax 85 C0 75 0E 48 8D 0D 77 2A 00 00 E8 0D 15 00 00
  18. Binary patch • バイナリを書き換える。 • 書き換え前 0000000000401593 : test eax,

    eax 85 C0 75 0E 48 8D 0D 77 2A 00 00 E8 0D 15 00 00 • 書き換え後 0000000000401593 : xor eax, eax 31 C0 75 0E 48 8D 0D 77 2A 00 00 E8 0D 15 00 00 • 今回は書き換え後の機械語のバイト数が同じですが足りないとき は90(nop)と言った何もしない命令で埋めることもあります。
  19. Binary patch • Hex Editorで見てみる

  20. After patched

  21. After patched • 間違ったパスワードを入力しているが” Correct! :D” に分岐してい る

  22. Fill nop • BCACTF I executable-2

  23. Fill nop • cmp ebx,1 83 FB 01 • xor

    eax, eax 31 C0 • そのまま書き換えたら1byteあまる! →nop(90)を使う
  24. Fill nop

  25. Fill nop • ZF = 0なためジャンプしない

  26. Thanks for listening.