【write-up】令和CTFのRev問題(和暦の流れ)

暫く忙しかったが、先週微妙に時間が出来たので久しぶりにCTFの問題に触った。遥か昔に開催された令和CTFのRev問題を復習したので記事にしようと思う。

 

.ELFのファイルが渡されて、実行すると文字列の入力を求められる。

f:id:yamanobori_programing:20190624105842p:plain

例のごとくradareで実行を解析してみる。最初、変数の初期化と思われる条件ループがあり、その後、入力に対する条件ループが2つある。

f:id:yamanobori_programing:20190624122916p:plain

変数の初期化と思われるループ

f:id:yamanobori_programing:20190624123007p:plain

入力受付後の条件ループ1

f:id:yamanobori_programing:20190624123059p:plain

入力受付後の条件ループ2


je命令の後の命令は移っていないが、それぞれsomething_is_wrong関数(入力を間違えたときに出てくる)が呼び出されるか、esp+0x18の値がインクリメントされている。最初の条件ループでは、入力された文字列はesp+0x36から格納されていて、ループ内のアセンブリ言語をゴリゴリと読み進めていくと、

[esp+0x36] xor [esp+0x1c] = [esp+0x22]

となるような入力の時に条件クリアとなるようである。

f:id:yamanobori_programing:20190624125407p:plain

なので、本来のesp+0x36の値は52 41 59 57 41(=RAYWA)となり、入力としてこれを与えるべきであるということがわかる。2回目のループも同様に考えることで入力すべき文字列を求める事が出来る。

f:id:yamanobori_programing:20190624125642p:plain

今回も同様にアセンブリ言語をゴリゴリ読み進めていくと

[esp+0x4e] xor [esp+0x28] = [esp+0x2f]

となる時に条件クリアとなり、入力として48 45 59 53 41 59(=HEYSAY)を与えると条件クリアとなる。

f:id:yamanobori_programing:20190624163908p:plain