Reversing進捗6
Reversing進捗6
Replace
動作確認
実行するとwindowが表示される
textboxには数字のみが入力でき、checkボタンを押すとプログラムが終了する。
正しい入力値を求めることが問題になっていそうだ。
解いていく
まずは参照している文字列を検索する。
表示されればいいと思われる文字列が見つかった。
このアドレスに飛んでみると
となっている。
直前にジャンプ命令がありこの処理に到達するのは不可能に見える。
その前の処理を見ているとGetDlgItemIntとあり、ここで入力された数値をとってきていることがわかる。 おそらくこのあたりで何か処理を行い"Correct!"を表示するアドレスに飛ぶのではないかと思う。
とりあえず、今のままではこのあたりの処理を実行しないままなのでその前のjump命令を潰す。
↓
では数値を取得した後の処理を追って行ってみる。
進んでいくとFoldStringWなる関数を読んでいる場所がある。
スタックの中を見てみると
という引数を渡していることがわかる。
さらにf9を押し、止まるまで実行するとよくわからないところで止まった。
ここでしばらく考えていたのだがレジスタの値を見てみるとeaxに601605CCと入っていた。
先程は入力値を1にしていたので別の値のときの挙動を見てみることにする。
入力値 -> eax値 2 -> 60105CD 3 -> 60105CE
つまり
eax = 60105CB + 入力値
となっているのがわかる。
eaxに入る値を文字列検索で見つかった"Correct!"のときのアドレスにしてやるとどうなるだろう
アドレスは00401071と00401073の間なので00401072に場合を検索してみる。
homeaddr = 0x601605CB getaddr = 0x401072 mask = 0xFFFFFFFF print((getaddr - homeaddr) + mask)
値が出たので入力してみる。
無事に"Correct!"が表示されたのでフラグだということが分かった。
感想
今回の問題はわからないことが多くあったため悔しいが他の人のWriteupなどを少しずつ参考にしながら解くことになった。
学んだこととしては、
・処理がそれ以上進まなければレジスタの値を確認することが大事だということ
・jump先のアドレスを書き換えるような処理の存在
が大きかった。
次回に似たような問題を見つけたら解けるようにしておかないといけないと感じた。