duckが送るBeginners CTF 2019 Leakage(Reversing)の解説

お久しぶりです。duckです。
今回はLeakageの解説になります。なりますが、あんまりよくはわかってないです。よくわからないけど分岐で張ってたら解けました。
まあ書いていきましょう。前回が難易度高かったので、なるべく優しく書きます。

ファイルをDLしたら、tar.gzファイルなので ”tar -zxvf ファイル名”で解凍します。
(→[Linux]ファイルの圧縮、解凍方法 - Qiita)

謎のファイルleakageがゲットできたと思います。
謎なのでfileコマンドをうってみましょう。 

f:id:falconctf:20190602194232p:plain
leakage
と、このようにどんなfileかがわかってしまう優れものコマンドです。fileえらい!
いろいろ書いてありますが、1行目にだけ注目しましょう。ELFって書いてあります。なんかこれはWindowsでいうexeファイルのようなもので、つまりは実行ファイルらしいです。へー。そうなのか。
じゃあ実行しよう。実行は"./leakage"でできます。
怒られます。許可がありませんとかでます。
なのでchmodコマンドで許可します。
"chmod 774 leakage"か"chmod a+x leakage"とかでいけるでしょう。たぶん。
(→chmod コマンド - Qiita)

さて実行できるようになったので、実行してみましょう。
”./leakage”!!!怒られます。なんなんだまったく。

f:id:falconctf:20190602195123p:plain
angry
どうやら./leakage flagという感じで打ち込めよばーか。ということらしいです。
flag知らんがな。それを知りたいんだよ。
というわけで、なんとか"falcon"で手を打ってもらえないか聞いてみます。
f:id:falconctf:20190602195420p:plain
falcon
ダメでした。ですよね。

まあつまりこのプログラムからFLAGを取り出せればいいんでしょう。がんばるぞい。
というわけで、アセンブリ見た。
(→アセンブリに触れてみよう - Qiita
まずはGUIで見たいのでIDAで見てみた。(初心者が雑に紹介するCTF ~bin編~ - Qiita

f:id:falconctf:20190602201014p:plain
IDA
ふむ。まったくわからん。
どこで分岐するのかだけはわかった。引用したサイトにも書いてあるが、IDAはメモリの書き換えができない?らしいので分岐を見るためだけに使うことにした。

ということでここからはgdbというLinuxに標準で搭載せれているデバッガを使っていく。こいつはメモリ書き換えもできる。レジスタ書き換えもできる。えらい。
噂によるとcmpとtestという命令 が分岐をつかさどるといっても過言ではないようだ。
(正確には分岐に使われるフラグを書き換える人たち。分岐の操作はjzとかjeが行うらしい→インラインアセンブラで学ぶアセンブリ言語 第3回 (1/3):CodeZine(コードジン))
上の画像にもtest命令があるが、これはフェイクだ。
eaxレジスタを書き換えて、無理やり条件を満たさせてみたところ(やり方は後で)correctとでた。
それだけである。FLAGは教えてもらえない。悲しい。

ずいぶん遠回りしたが、次のステップに進もう。ぼんやりアセンブリを見てると怪しい関数がいることに気が付く。
そうis_correctだ。明らかにこいつが、FLAGと入力との比較を行っている関数だろう。
こいつを見る。

書くのに飽きてきたので明日続きを書く。
gdbについては
gdbの使い方のメモ - ももいろテクノロジー
のページを参考にさせていただいた。