CpawCTFで学ぶCutter入門

CpawCTFのReversingの問題を通してCutterの使い方を書いていく。
[CpawCTF](https://ctf.cpaw.site)
#Cutterについて
https://cutter.re
radare2を搭載したOSSのGUIリバースエンジニアリングツール
ファイルの情報やディスアセンブルやデコンパイルなど色々と出来る。
# 問題を解いてみる
##[Level1] Can you execute ?
ファイルを実行してくださいという問題。
では、Cutterを起動してSelectボタンを押す。
<img width="452" alt="スクリーンショット 2020-06-28 21.31.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274361/cb94678e-e471-91a3-6ac1-9cb009c05c7f.png">
そうするとファイルをインポートできる。
exec_meを選択したら、Openボタンを押すと以下のようになる。
<img width="599" alt="スクリーンショット 2020-06-28 21.35.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274361/ecb15240-422e-b5df-48f7-f0d70477c10c.png">
ここでは、どれくらい解析するか選べる。radare2のaaaやaaaaにあたる。
今回は適当にAuto-Analysis(aaa)で解析してみる。
OKボタンを押すと解析が始まり、解析が終わると以下のように色々と解析結果が表示される。
<img width="1478" alt="スクリーンショット 2020-06-28 22.43.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274361/cf1cdca4-04ac-ea82-137c-b7fd85b3af73.png">
下の「Dashboard」タブを開くと解析したファイルの情報が表示される。
<img width="1478" alt="スクリーンショット 2020-06-28 22.46.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274361/6bff26c4-a4e3-5e57-8ca4-0673e16803f3.png">
ここでは、ファイルの種類やHash値などの情報が分かる。
OVERVIEWの部分を見る限り、exec_meは64bitのelfファイルだと分かる。
Linuxのfileコマンドと似たような情報が出てくる。
elfファイルだとわかったので、Linux環境で実行するとflagが出てくる。
##[Level2] reversing easy!
出力がないファイルからフラグを探す問題。
ファイルのインポートは先ほどと同じようにしてみる。
「Dashboard」タブのOVERVIEWの部分を見ると、32bitのelfファイルだと分かる。
次に「Strings」タブを開いてみると以下のようになる。
<img width="1478" alt="スクリーンショット 2020-07-05 15.34.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274361/f0ef1c7e-636c-c6d9-4eb0-f803beaa5a5e.png">
ここの部分はLinuxのstringsコマンドと同じような出力が表示されていることが分かる。
中身を見ていくとflagらしき文字列が表示されている。
<img width="284" alt="スクリーンショット 2020-07-05 15.39.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274361/2703c290-fe95-29bd-80b0-3c7fe6a29cff.png">
念のため「Disassembly」タブも見てみる。
<img width="1479" alt="スクリーンショット 2020-07-05 15.54.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274361/91235eb1-dc58-4fef-b744-38cfbcecb225.png">
ここでディスアセンブルした結果を見ることができる。
上の画像はmainの部分をディスアセンブルした結果を表示している。
内容を見てみると、先ほど表示されていたflagらしき文字列をそのまま変数に入れてることが分かる。
これがflagで良さそうなので、これを入力する。
##[Level3] またやらかした！
さっきと同様出力がないファイルからフラグを探す問題。
ファイルをインポートし、「Dashboard」タブを見てみよう。
<img width="1479" alt="スクリーンショット 2020-07-21 16.59.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274361/ed165954-b783-0aa5-8f9c-6d67db7b8624.png">
今回も32bitのelfファイルだと分かる。
「Strings」タブも見てみるが、特にflagらしき文字列は見当たらない。
「Disassembly」タブでmainの部分を見てみる。
<img width="1479" alt="スクリーンショット 2020-07-21 17.06.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274361/52cc6120-e864-a051-9902-facccf03d869.png">
上の画像を見てみると、前回の問題みたいに何かの文字列を変数に代入していることが分かる。
それ以降の処理を見てみる。
<img width="1479" alt="スクリーンショット 2020-07-21 17.48.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274361/0e707026-831f-ffb5-8e7a-4b5e1d9faeba.png">
0x8048478~0x8048495でループしていることが分かる。
「Graph」タブを開くと分かりやすくなる。
<img width="1479" alt="スクリーンショット 2020-07-21 17.28.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274361/167d92a5-8d30-94db-a340-8fae007daa37.png">
グラフビュー形式で表示することができる。
ループの内容をざっと確認してみる。
・[var_80th]が0xd(13)以下ならループする
・eaxと[var_7ch]をxorする
・[var_80th]に1を代入する

[var_80th]は0、[var_7ch]は0x19(25)が代入されている。
つまり、[var_80th]が0~13の間ループするので、eaxと0x19(25)を14回xorしている。
最初に出てきた謎の文字列の文字数と一致しているので、xorしている時のeaxはおそらく謎の文字列が代入されてそう。
一応確認してみる。

一文字目:0x7a(z) xor 0x19 → 0x63(c)
二文字目:0x69(i) xor 0x19 → 0x70(p)
三文字目:0x78(x) xor 0x19 → 0x61(a)
四文字目:0x6e(n) xor 0x19 → 0x77(w)

先頭四文字しか確認してないが、flagっぽい文字列が出たので、eaxに謎の文字列が代入されているのだろう。
そして、xorされたやつがflagになる。

ちなみに、「Decompiler」タブでデコンパイルした内容を確認できる。
<img width="1479" alt="スクリーンショット 2020-07-21 19.23.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274361/48ce010e-e3e3-05b1-65f8-b8fe9746a5bd.png">