【Rev・バイナリ解析関係】ghidraを使ってTAMUctfのKeygenmeを解こうとしてみた【Rev】

TAMUctfの問題でRevのKeygenmeを解こうとしていたがなかなか解けなかったので復習してみようと思う。なので先日NSAからリリースされたghidraに登場してもらいましょう。

f:id:yamanobori_programing:20190307225207p:plain

まぁバックドアの噂もあるがとりあえず使ってみようと思う。僕がghidraを使おうと思った理由にデコンパイラの存在がある。今までデコンパイラはIDAproとかに入ってることは知ってたが、いかんせん有料版だったので手を出すのを躊躇していた。一方ghidraは無料なんで使わない手はなかろうということになった。

f:id:yamanobori_programing:20190307225756p:plain

本当にCでデコンパイルされてる...

コンパイラに今まで全く触ってきてなかったのでCでデコンパイルされるということがどれほどのことなのかよく分からないが、これがあったらCTFはかどるだろうな~とか思った()

では、これを受けて問題を解いていこうと思う。この問題は適当な文字列を与え、その文字列が正規のものならサーバーのflag.txtが読みだされることになっており、明らかに正規でない文字列をはじき出すverify_key()と、verify_key()のふるいを通過した文字列を一定の規則に従って他の文字列に変換するenc()で構成されている。CTF期間中はアセンブリ言語を読みながら頑張って解読していたら時間切れになってしまったが、ghidraのデコンパイラによってどのような規則で変換が行われているかについていとも簡単に解明する事が出来た。一方、返還後の文字列については、Keygenmeに対しstringsコマンドを実行することで得る事が出来る。

f:id:yamanobori_programing:20190307231932p:plain

変換後の文字列はこれになると推察される。

以上のことから、変換後の文字列に対し入力文字列に対して行った規則の逆を行えば入力すべき文字列が出てくるはずであるので、これを求めるプログラムを書いていこうと思った。

だがしかしである。

いざ書いてみようと思っても一向に筆が進む気配がない。そういえば最近まともにプログラム書いたり読んだりしてなかった...。コーディングの力が明らかに不足している。Revの勉強をどのように進めていったらよいか昨年のBeginnersの時に講師の方に聞いたことがあったが、自分でコードを書いてみて、その逆アセンブル結果を眺めるのが一番効果的なようである。こういうところでプログラムの実行の流れを追う能力を身に着ける以外にも、自然にコーディングの力を養う事が出来るという副産物もあったのだろうと今更ながら反省している。また日々何かしらのプログラムを作成する生活に戻ろうと思った。