全体表示

[ リスト ]

今回も前回と同じくクラッキングバイブル同梱の
CD内にあるCrackMe0x01を別のアプローチでクラックしてみる。



前回はチェック部分をNOPで書き換える事によって、
クラックを行った。
このプログラムは

入力した値のチェック
正解している場合の処理
不正解な場合の処理

といった具合になっており、前回は入力した値のチェックの部分
(厳密にはチェック後に影響される分岐命令)を
NOPに書き換える事でチェックをパス(=スルー)し、そのまま
正解している場合の処理へ突入させていただけである。
つまり、前回は処理の順番を利用してクラックに成功しただけである。

仮に

入力した値のチェック
不正解な場合の処理
正解している場合の処理

という処理の順番になっていた場合、
入力した値のチェックの処理の部分をNOPで書き換えたとしても、
不正解な場合の処理に突入してしまう事となる。
(バッファオーバーフローのように大規模に
NOPで書き換えるという手もあるが、
今回は考えないこととする)

そこで今回は正解している場合へ処理を
強制的に移行させる事を考える。
処理を移行させる命令の1つとしてJMP命令がある。
JMP命令を利用しクラックしてみる。

クラックのやり方としては前回とほぼ同様である。

1回実行する
イメージ 1
イメージ 2


GetWindowText関数を検索する
検索方法は Ctrl + n である。
イメージ 3

すべての参照にブレークポイントをセットする。
イメージ 4

シリアルナンバーを適当に入力し登録を押す。
イメージ 5

すると、GetWindowTextAで処理が止まる。
イメージ 6

F8を押して
TEST EAX,EAX
JNZ SHORT CrackMe0.004011F8
まで処理を進める。
イメージ 7

ここまでは前回と同じである。
今回は冒頭でも書いた通り、NOPではなくJMP命令を使う。
単純に処理を 004011E2 へ移行させれば良いので、

TEST EAX,EAX
JMP 004011E2
と書き換えてやればいい。

書き換え対象の命令を右クリックし、逆アセ修正をクリック。
イメージ 8

すると下の画像のような入力画面になる。
イメージ 9

JMP 004011E2
と入力し、アセンブルをクリックする。
イメージ 10
イメージ 11

赤くなっているところが書き換わった部分である。
入力画面のキャンセルをクリックし閉じる。
そのまま処理を進めると、登録に成功したことが分かる。
つまりクラックに成功した。
イメージ 12


[*]余談
書き換えた命令の次に
JNZ SHORT CrackMe0.004011F8
という命令がある。
JNZ命令とはフラグレジスタの内容によって分岐させる命令である。
(ZFが0ではない場合にジャンプする)

これを利用して

TEST EAX,EAX


CMP EAX,EAX

と書き換えるクラック手法も存在する。
こちらの方がクラック後の分岐において、
フラグレジスタの矛盾が小さい為
より自然なクラッキングだと思われる。

この記事に

閉じる コメント(0)

コメント投稿

顔アイコン

顔アイコン・表示画像の選択

名前パスワードブログ
絵文字
×
  • オリジナル
  • SoftBank1
  • SoftBank2
  • SoftBank3
  • SoftBank4
  • docomo1
  • docomo2
  • au1
  • au2
  • au3
  • au4
投稿

開く トラックバック(0)


プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事