【write-up】令和CTFのRev問題(和暦の流れ)
暫く忙しかったが、先週微妙に時間が出来たので久しぶりにCTFの問題に触った。遥か昔に開催された令和CTFのRev問題を復習したので記事にしようと思う。
.ELFのファイルが渡されて、実行すると文字列の入力を求められる。
例のごとくradareで実行を解析してみる。最初、変数の初期化と思われる条件ループがあり、その後、入力に対する条件ループが2つある。
je命令の後の命令は移っていないが、それぞれsomething_is_wrong関数(入力を間違えたときに出てくる)が呼び出されるか、esp+0x18の値がインクリメントされている。最初の条件ループでは、入力された文字列はesp+0x36から格納されていて、ループ内のアセンブリ言語をゴリゴリと読み進めていくと、
[esp+0x36] xor [esp+0x1c] = [esp+0x22]
となるような入力の時に条件クリアとなるようである。
なので、本来のesp+0x36の値は52 41 59 57 41(=RAYWA)となり、入力としてこれを与えるべきであるということがわかる。2回目のループも同様に考えることで入力すべき文字列を求める事が出来る。
今回も同様にアセンブリ言語をゴリゴリ読み進めていくと
[esp+0x4e] xor [esp+0x28] = [esp+0x2f]
となる時に条件クリアとなり、入力として48 45 59 53 41 59(=HEYSAY)を与えると条件クリアとなる。