20:53 *** IPUSIRON has joined channel #rce 20:53 こんばんは 20:53 こんばんわ 20:54 >yuushi_q< こんばんは 20:55 こんばんは 21:02 >yuushi_q< 時間になりましたが、まだ全員あつまんないんでもうちょっと、待ちましょうか。 21:02 了解ですー。 21:02 そですね 21:05 >yuushi_q< nonameさんの意見でログをとらない雑談用のチャンネルを立てました。#rce2です。 21:07 >yuushi_q< それでははじめますか。 21:08 はい、お願いします 21:08 はい 21:09 宜しくお願いします 21:09 >yuushi_q< 今回は前回の続きからです。 21:09 >yuushi_q< 前回はBPチェックの開始場所を特定しました。今回はここから始めます。 21:10 >yuushi_q< まず、「crackme02a.exe」をOllyDbgで開きましょう。 21:10 >yuushi_q< 004011E9と0040240にブレークポイントを仕掛けて下さい。 21:10 >yuushi_q< 004011E9は前回見つけたBPチェックの開始場所です。 21:10 >yuushi_q< 0040240はGetWindowTextA関数が呼び出される場所です。OllyDbgは前回のブレークポイントを保存しておいてくれるので、こちらは設定されているかもしれません。 21:11 >yuushi_q< ここまでOKですか? 21:11 はい 21:12 ・・・ 21:12 あれ 21:13 004011E9と0040240ですか? 21:13 >yuushi_q< そうです。 21:13 読み込んだらデフォルトでブレークポイントセットされている場所がありますが、それはそのままでいいんですよね? 21:14 00401240の間違いではないですか? 21:14 >yuushi_q< すみません。00401240でした。 21:15 >yuushi_q< > IPUSIRONさん そのままで大丈夫です。 21:15 わかりました 21:15 準備できました 21:16 >yuushi_q< F9を押して、プログラムを実行し、パス入力欄に適当なパスワードを入れて登録ボタンを押します。 21:16 >yuushi_q< 004011E9で止まりまましたか? 21:17 はい 21:17 はい 21:18 はい 21:20 >yuushi_q< ここからBPチェックをする関数の始まりです。 21:21 >yuushi_q< 実際にはMASMで作られているので、関数ではないですが・・・ 21:23 >yuushi_q< ここから詳しく見ていきます。 21:23 >yuushi_q< その前に処理の流れを見てみましょう。 21:23 >yuushi_q< F8を押し下げたままにして見てください。 21:23 >yuushi_q< 次次に命令が実行されます。 21:24 >yuushi_q< 何か気付いたことはありますか? 21:25 同じ命令の実行を何度か繰り返しているようですね。 21:25 なんか、途中でループしてる…… 21:25 >yuushi_q< そこが今回のキーポイントです。 21:27 >yuushi_q< よく見ると、cmpとjbの間を何回も繰り返してみます。これはループを表しています。 21:27 >yuushi_q< 命令を見ただけで、ループを判断するのは面倒なので、実際に実行させて、ループを判定しています 21:27 >yuushi_q< 今回は話の流れ上、具体的な命令を見ながら、ループを判定していません。 21:31 >yuushi_q< 実際には解析途中で命令の流れでループっぽい箇所を見つけたら、F8でループを判定に使うと便利でしょう。 21:32 >yuushi_q< 重要なんでループの先頭と終了をメモっといて下さい。 21:32 >yuushi_q< ここまでOKですか? 21:32 はい 21:32 OKです 21:33 はい 21:34 >yuushi_q< 再スタートさせて、先ほど同様にパス入力欄に適当なパスワードを入れて登録ボタンを押します。 21:34 >yuushi_q< 詳しく見ていきます。 21:35 >yuushi_q< xor eax,eaxは eax=0と同じなので問題ないですね。 21:35 >yuushi_q< 次のleaは第2オペランドが差すアドレス(数値)を計算したあと、第1オペランドにコピーする命令です。 21:35 >yuushi_q< 今回は単にlea esi, dword ptr [401233]みたいなのだとesi=401233となります。 21:36 >yuushi_q< その次のmovとaddによりebx=0xCCになります。 21:37 >yuushi_q< ここまでOKですか? 21:37 はい 21:37 はい 21:38 >yuushi_q< IPUSIRONさんは大丈夫ですか? 21:40 >yuushi_q< 返事がないですが、先に進みます。 21:40 OKです 21:40 >yuushi_q< ここでmovとaddにわける必要はあるのでしょうか? 21:40 たまにトイレなどで席を外すので、私の返事がなくても進んでください 21:40 >yuushi_q< わかりました。 21:41 自分の場合も、返事無くても進んでください。 21:41 >yuushi_q< はい。 21:43 >yuushi_q< movとaddにわけると処理的には少々無駄ですね。 21:44 >yuushi_q< そこまでして分ける理由はあるのでしょうか? 何か考えがある方はいますか? 21:44 コンパイラが自動的にわけたということはそこに何か仕掛けがあって、わけざるえなかったとか? 21:45 アセンブリ言語以外でこのcrackmeを作ったと言うのが前提ですが 21:45 >yuushi_q< アセンブリ言語のMASMで作られたプログラムなんでそれはないです。 21:45 解析者にとってわかりにくくするためですか? 21:46 >yuushi_q< いい線いってますね。何を分かりにくくするためですか? 21:46 ブレークポイントのチェックをここでしていることを悟られないようにするため? 21:48 うぅーん、、、わからないです。 21:48 >yuushi_q< おしいですね。正確には0xCCを隠ぺいするためです。 21:48 >yuushi_q< 今回のように0x36や0x96のような定数を即値と呼びます。即値はそのままの数値が実効ファイルにバイナリで書き込まれまれています。 21:49 >yuushi_q< そのまま書き込まれているということは、0xCCが検索され得るということです。倍直と同じ理屈です。 21:50 >yuushi_q< 今回の場合は0xCCという即値を使用しないために二つにわけることで、検索されることを回避しています。 21:50 *** noname0 has joined channel #rce 21:50 >yuushi_q< ここまでOKですか? 21:50 はい 21:50 なるほど 21:50 OKです 21:50 こんばんは 21:50 こんばんわ 21:50 こんばんは 21:50 こんばんは 21:50 >yuushi_q< こんばんは 21:52 >yuushi_q< 次は先ほど見たループの先頭ですね。 21:52 >yuushi_q< cmpからcallまでをまとめますと、こんな感じです。 21:52 >yuushi_q< for (;eax<91;eax++){ 21:52 >yuushi_q< if (*(esi+eax)==BL) //BL=0xCC 21:52 >yuushi_q< //messgge 21:52 >yuushi_q< } 21:53 >yuushi_q< MASMなんで、forとかないです。イメージと思って下さい。 21:54 >yuushi_q< 本当はforじゃちょっとまずいのです。do whileを使うべきですが、それはあんまり重要じゃないし、forのほうが分かりやすいと思ったのでこっちにしました。 21:54 >yuushi_q< jeがあるようにcmp命令の結果が0すなわち、byte ptr [esi+eax]とblが等しいと 21:54 >yuushi_q< きジャンプします。 21:55 >yuushi_q< ジャンプ後の処理を眺めるとメッセージボックスを表示させます。ここで、ジャンプするせいで、BPがバレてますね。 21:55 >yuushi_q< ここまでOKですか? 21:56 はい 21:56 はい 21:57 はい 21:57 >yuushi_q< では、dword ptr [esi+eax]はなんでしょうか? 21:59 どこの命令ですか? 22:00 >yuushi_q< すみません。004011FC > 381C30 CMP BYTE PTR DS:[EAX+ESI],BLでした。 22:03 >yuushi_q< F7を押して、cmpまで進めてみてください。 22:05 >yuushi_q< 逆アセ結果ののリストとかが書かれている下にBL=CCとかかいてあるのがわかりますか。 22:06 はい 22:06 はい 22:08 >yuushi_q< DS:[401237]とか書かれているのが実際のDS:[esx+eax]です。 22:09 >yuushi_q< 初回は401233から最大4012C4まで変化します。 22:11 >yuushi_q< 401233は少ししたをスクロールすれば見えますね。 22:12 >yuushi_q< このアドレスにある数値が0xCCのときメッセージボックスが出ます。 22:13 >yuushi_q< 実際のバイナリはアドレスの右横にあります。 22:14 >yuushi_q< ここまでOKですか? 22:14 OKです 22:14 はい 22:15 >yuushi_q< 00401233 から04012C4までの中で0xCCを探してみてください。 22:16 ないです。 22:17 >yuushi_q< それは、問題ですね。 22:18 >yuushi_q< [esi+eax]==BLの時ジャンプするのは確実ですね? 22:20 >yuushi_q< それなのにジャンプするということはおかしいですよね。 22:20 はい。進めてみたら EAX+ESI=00401240 の時にジャンプしました。 22:21 >yuushi_q< その命令には0xCCはありますか? 22:21 そこは E8 になってます。 22:22 CCはありません 22:22 >yuushi_q< 皆さんも、進めると00401240ジャンプするはずです。 22:23 >yuushi_q< そこにあるのがE8なのにジャンプするということはOllyDbgのバグですね(笑) 22:24 >yuushi_q< ここまでOKですか? 22:25 はい 22:25 OKですけど、バグなんですか? 22:25 >yuushi_q< もちろん、そんなことはないです。 22:26 >yuushi_q< じゃあollydbgはなぜ、E8とCCを取り違えたのでしょうか?それはOllyDbgの仕様です。 22:28 >yuushi_q< OllyDbgはプログラムを実行するとき、ウィンドウに命令を解析して表示します。 22:30 >yuushi_q< その後は例え、あるアドレスこの場合は00401240がプログラム中に書き換えられても書き換えられたバイナリに変更しないのです。 22:30 >yuushi_q< ここまでOKですか? 22:30 なるほど、OKです 22:33 >yuushi_q< メニューから「表示」->「メモリ」をクリックしてください。Alt+Mでもいいです。 22:34 >yuushi_q< are 22:35 >yuushi_q< あれ? 見れない。しばしお持ちください。 22:38 >yuushi_q< ollydbgでは変更が確認できないようなので、別のソフトを使います。 22:39 >yuushi_q< 皆さん、「うさみみハリケーン」はダウンロード済みですか? 22:39 はい 22:39 落としてきます 22:40 OKです 22:43 >yuushi_q< 「うさみみハリケーン」を起動し、crkme02a.exeを選択してください。 22:46 >yuushi_q< メニューから「移動」->「表示アドレスを指定」をクリックしてください。 22:46 >yuushi_q< 表示アドレスに00401240to 22:47 >yuushi_q< と入力して「アドレス変更」をクリックして下さい。 22:48 CC になってます。 22:48 >yuushi_q< メインウィンドウを見るとCCが見えますね。 22:49 >yuushi_q< ここまで大丈夫ですか? 22:49 OKです 22:50 >yuushi_q< これで実際に変更が確認できたんでいいですね。OllyDbgの仕様ということで。 22:51 >yuushi_q< CCとは何でしょう。 これがブレークポイントの正体です。 22:52 インテルアーキテクチャソフトウェアデベロッパーズマニュアルによると、int 3 命令のようです。 22:52 >yuushi_q< それ打とうとしたのに・・・ 22:53 あっ、 22:53 聞いた訳じゃなかったのですか・・・w 22:53 ごめんなさい(__) 22:54 >yuushi_q< まあ、打つ手間が省けたのでThanks(笑)。 22:54 *** test___ has joined channel #rce 22:54 おくれました 22:54 こんばんわ 22:55 こんばんわです 22:55 >yuushi_q< こんばんわ 22:55 こんばんは 22:55 今日は聴講しますので、私にかまわないで進めてもらっていいですか 22:57 >yuushi_q< ログ渡そうと思ったんですが、vistaに変えてからどこにあるかわからない(泣)。誰かtest__さんにお願いします。 22:58 >yuushi_q< 続けます。CCはint 3命令というブレークポイントを発生させる命令です。 22:58 こんばんは 22:58 >yuushi_q< さて、ブレークポイントとは何でしょうか? 22:59 こんばんはです 23:00 >yuushi_q< 今までのやり方でプログラムをブレークポイントで止めることができることがわかります。 23:00 >yuushi_q< 実はブレークポイントには3種類あります。 23:00 >yuushi_q< int 3命令はそのうちの一つでしかないのです。 23:01 >yuushi_q< 実際にはブレークポイントは仕掛ける場所に細工をして例外を発生させ止めます。 23:02 >yuushi_q< C++のjava例外のようなものはソフトウェア例外と呼ばれます。 23:02 >yuushi_q< 一方、ブレークポイントはハードウェアレベルの例外のため、ハードウェア例外 23:02 >yuushi_q< と呼ばれます。 23:03 >yuushi_q< 実際にはブレークポイントの3種類とはINT3ブレークポイント、メモリアクセス違反、ブレークポイントレジスタを使って例外を発生させます。 23:04 >yuushi_q< ここまで大丈夫ですか? 23:04 OKです 23:04 はい 23:05 >yuushi_q< intelのマニュアル読めば詳しく書いてありますが、簡単に3つの特徴を書きます。 23:05 >yuushi_q< INT3は一番よく使われています。 23:05 >yuushi_q< 一般的にブレークポイントといえばこれを指します。 23:06 >yuushi_q< 今まで使っていたのはこのint3命令になります。 23:07 >yuushi_q< INT3命令(0xCC)は実行されたときにブレークポイント例外を発生させるものです。 23:07 >yuushi_q< 普通はもともとプログラムにこの命令は含まれていないため、デバッガはBPを仕掛けたい場所の命令の最初のバイトを0xCCに書き換えることでBPをセットします 23:10 >yuushi_q< 、ブレークポイントレジスタと書きましたが、一般的にはデバッグレジスタと呼びます。 23:12 >yuushi_q< レジスタに設定するため、本来、スレッド毎に設定する必要がありますが、ollydbgは自動的にすべてのスレッドに設定します。 23:13 >yuushi_q< レジスタにアドレスと条件を書いて設定しますが、設定数に条件があるので少々不便です。 23:14 >yuushi_q< メモリアクセス違反はこれはさっきの2つと違い本来ブレークポイントのために 23:14 >yuushi_q< あるものではありません。名前のままです。 23:17 >yuushi_q< メモリにはアクセス属性があります。これを例外を発生させたいアドレスに本来ありえない属性を設定することで例外を発生させollydbgで検出します。 23:18 >yuushi_q< だいぶ、端折りましたが、大丈夫ですか? 23:18 覚えることがいっぱいありますが、なんとか大丈夫です 23:18 OKです 23:19 大丈夫です。 23:20 >yuushi_q< ollyDbgではどの種類でもしかけられます。 23:21 >yuushi_q< 適当な命令で右クリックからブレークポイントでそれぞれ仕掛けられます。 23:22 >yuushi_q< ハードウェアブレークポイントとあるのがデバッグレジスタを使ったブレークポイントです。 23:23 >yuushi_q< 今回はint3命令のみを検出しているようなのでハードウェアブレークポイントに変えます。 23:25 >yuushi_q< ollydbgを再スタートさせ、「表示」->「ブレークポイント」ですべてのブレークポイントを右クリックから無効にします。 23:28 >yuushi_q< アドレス00401240で右クリック、「ブレークポイント」->「ハードウェアブレークポイント」をクリック。 23:29 >yuushi_q< F9で実行して、適当に入力して、登録を押すと00401240でブレークします。 23:29 >yuushi_q< ここまで大丈夫ですか? 23:29 はい 23:30 OK 23:31 です 23:31 OK 23:31 >yuushi_q< ここまでできたら、しめたもんです。後は自力でパスを探してみましょう。 23:32 はい 23:34 >yuushi_q< F7とF8を上手く使うと簡単にできます。右上にあるレジスタは右クリックから変更できるのでそれを上手くつかいましょう。 23:36 >yuushi_q< できたら報告お願いします。 23:38 まだOllyDbgの使い方理解してませんが、復習しながらがんばりたいです 23:41 もしかして今比較していくという意味ですか? 23:41 できました。 23:43 >yuushi_q< じゃあ、あとは自由課題ということで、解散にします。自分は12:00までは残るので質問あればしてください。 00:00 >yuushi_q< そろそろ落ちます。ご聴講ありがとうございました。 00:00 お疲れ様でした 00:00 ありがとうございました。 00:01 おつかれさまでした