a

よろしくのキワミ

Reversing進捗6

Reversing進捗6

Replace

動作確認

実行するとwindowが表示される

f:id:toDo:20190126124734p:plain

textboxには数字のみが入力でき、checkボタンを押すとプログラムが終了する。
正しい入力値を求めることが問題になっていそうだ。

解いていく

まずは参照している文字列を検索する。

f:id:toDo:20190126125041p:plain

表示されればいいと思われる文字列が見つかった。

このアドレスに飛んでみると

f:id:toDo:20190126130022p:plain

となっている。
直前にジャンプ命令がありこの処理に到達するのは不可能に見える。

その前の処理を見ているとGetDlgItemIntとあり、ここで入力された数値をとってきていることがわかる。 おそらくこのあたりで何か処理を行い"Correct!"を表示するアドレスに飛ぶのではないかと思う。

とりあえず、今のままではこのあたりの処理を実行しないままなのでその前のjump命令を潰す。

f:id:toDo:20190126130837p:plain

f:id:toDo:20190126130732p:plain

では数値を取得した後の処理を追って行ってみる。

f:id:toDo:20190126131749p:plain

進んでいくとFoldStringWなる関数を読んでいる場所がある。
スタックの中を見てみると

f:id:toDo:20190126141521p:plain

という引数を渡していることがわかる。

さらにf9を押し、止まるまで実行するとよくわからないところで止まった。
ここでしばらく考えていたのだがレジスタの値を見てみるとeaxに601605CCと入っていた。 先程は入力値を1にしていたので別の値のときの挙動を見てみることにする。

入力値 -> eax値
2 -> 60105CD
3 -> 60105CE

つまり

eax = 60105CB + 入力値

となっているのがわかる。
eaxに入る値を文字列検索で見つかった"Correct!"のときのアドレスにしてやるとどうなるだろう

f:id:toDo:20190126152334p:plain

アドレスは00401071と00401073の間なので00401072に場合を検索してみる。

homeaddr = 0x601605CB
getaddr = 0x401072
mask = 0xFFFFFFFF

print((getaddr - homeaddr) + mask)

f:id:toDo:20190126153519p:plain

値が出たので入力してみる。

f:id:toDo:20190126153825p:plain

無事に"Correct!"が表示されたのでフラグだということが分かった。

感想

今回の問題はわからないことが多くあったため悔しいが他の人のWriteupなどを少しずつ参考にしながら解くことになった。

学んだこととしては、
・処理がそれ以上進まなければレジスタの値を確認することが大事だということ
・jump先のアドレスを書き換えるような処理の存在
が大きかった。

次回に似たような問題を見つけたら解けるようにしておかないといけないと感じた。

プライバシーポリシー お問い合わせ