This page looks best with JavaScript enabled

【THM: TryHackMe】Advent of Cyber 2を解いてみた【Day17】

 ·  ☕ 4 min read

はじめに

TryHackMeのAdvent of Cyber 2 Day17のWriteUPです。

今回はradare2を使ったバイナリ解析の章になっています。

本記事はすべてのセキュリティに携わる人に向けて執筆しており、クラッキングを推奨するものではありません。本記事の手法を用いて、許可された環境以外で実行することは絶対にやめてください。

ReverseELFneering

まずはradare2でデバッグモードでchallenge1を開きます。

1
r2 -d ./challenge1

radare2で開いたらまずは解析させることが一般的です。aaコマンドで解析させます。

1
[0x00400a30]>aa

解析が終わったら、aflコマンドで関数の一覧を表示させます。analyse functions listと覚えます。

1
[0x00400a30]> afl

大量に関数が出てきたので、grepしてあげます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[0x00400a30]> afl | grep main
0x00400b4d    1 35           sym.main
0x00400de0   10 1007 -> 219  sym.__libc_start_main
0x00403840   39 661  -> 629  sym._nl_find_domain
0x00403ae0  308 5366 -> 5301 sym._nl_load_domain
0x00415ef0    1 43           sym._IO_switch_to_main_get_area
0x0044ce10    1 8            sym._dl_get_dl_main_map
0x00470430    1 49           sym._IO_switch_to_main_wget_area
0x0048f9f0    7 73   -> 69   sym._nl_finddomain_subfreeres
0x0048fa40   16 247  -> 237  sym._nl_unload_domain

ここで、main関数がどうなっているのか確認します。

pdfコマンドで確認しましょう。print disassembly functionと覚えます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
[0x00400a30]> pdf @main
            ;-- main:
/ (fcn) sym.main 35
|   sym.main ();
|           ; var int local_ch @ rbp-0xc
|           ; var int local_8h @ rbp-0x8
|           ; var int local_4h @ rbp-0x4
|              ; DATA XREF from 0x00400a4d (entry0)
|           0x00400b4d      55             push rbp
|           0x00400b4e      4889e5         mov rbp, rsp
|           0x00400b51      c745f4010000.  mov dword [local_ch], 1
|           0x00400b58      c745f8060000.  mov dword [local_8h], 6
|           0x00400b5f      8b45f4         mov eax, dword [local_ch]
|           0x00400b62      0faf45f8       imul eax, dword [local_8h]
|           0x00400b66      8945fc         mov dword [local_4h], eax
|           0x00400b69      b800000000     mov eax, 0
|           0x00400b6e      5d             pop rbp
\           0x00400b6f      c3             ret

インテル記法のアセンブリが表示されています。
AT&T記法に変更する場合は以下のコマンドで変更できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
[0x00400a30]> e asm.syntax=att
[0x00400a30]> pdf @main
            ;-- main:
/ (fcn) sym.main 35
|   sym.main ();
|           ; var int local_ch @ rbp-0xc
|           ; var int local_8h @ rbp-0x8
|           ; var int local_4h @ rbp-0x4
|              ; DATA XREF from 0x00400a4d (entry0)
|           0x00400b4d      55             pushq %rbp
|           0x00400b4e      4889e5         movq %rsp, %rbp
|           0x00400b51      c745f4010000.  movl $1, local_ch
|           0x00400b58      c745f8060000.  movl $6, local_8h
|           0x00400b5f      8b45f4         movl local_ch, %eax
|           0x00400b62      0faf45f8       imull local_8h, %eax
|           0x00400b66      8945fc         movl %eax, local_4h
|           0x00400b69      b800000000     movl $0, %eax
|           0x00400b6e      5d             popq %rbp
\           0x00400b6f      c3             retq

sコマンドでmain関数に移動したいと思います。

1
2
[0x00400a30]> s main
[0x00400b4d]>

現在のアドレスが書き換わっていることが確認できます。

VでVisual Modeに移動し、pを押すことで表示モードを変更させます。
自分はレジスタやアセンブリが表示されているモードが好きです。

radare2 debug mode

F2を押すとブレークポイントを設置できます。

radare2 break point

s/F7でStep, S/F8でStep Overです。

What is the value of local_ch when its corresponding movl instruction is called (first if multiple)?

対応するmovl命令が呼び出されたとき(複数ある場合は最初に)、local_chの値はどうなりますか?

普通にアセンブリを読んでもいいですが今回はせっかくradare2を使っているので、使い方も兼ねて説明してきます。

radare2ではripと表示されている場所にいます。

最初にmovl命令が呼び出されたときまで進めていきます。

s/Sで進めてもよいですし、:dcでブレークポイントまで進めることもできます。

radare2 step to first movl

:px @ rbp-0xcでlocal_chの値を確認できたら、それが答えです。

radare2 local_ch

What is the value of eax when the imull instruction is called?

imull命令が呼び出されたときのeaxの値は何ですか?

これも先程とどうようにimull命令が呼び出された直後まで移動します。

radare2 step to imull

StepしたあとにVisual Modeだとレジスタの値がすぐに確認ができるので便利です。

eaxの値が答えになります。

What is the value of local_4h before eax is set to 0?

eaxが0に設定される前のlocal_4hの値は何ですか?

eaxが0に設定される直前まで移動します。

radare2 before movl $0 %eax

ここでlocal_4hの値を確認できたら、それが答えになります。

radare2 local_4h

おわりに

今回はradare2を使ったバイナリ解析をやりました。

radare2は非常に多機能かつ学習コストが高いので、自分もまだまだ使いこなせていないですが、Visual Modeでのradare2の使い方のWriteUPがあまり見つからなかったので、参考になると幸いです。

他にもこういう風に使うと便利などがあれば教えてください。

Share on

yuk1h1ra
WRITTEN BY
yuk1h1ra
Security Engineer