21:00 >yuushi_q< では、時間が来ましたので始めますか。 21:00 宜しくお願いします 21:00 よろしくです。 21:00 よろしくお願いします 21:02 よろしくおねがいします 21:02 >yuushi_q< 本日必要なソフトはOllyDbgとeagle0wlさんのcrackmeです。皆さんありますか? 21:03 はい 21:03 大丈夫です。 21:04 OKです 21:05 今DLしてきました。OKです 21:05 >yuushi_q< 今回はeagle0wlさんのcrackme #02aを使います。 21:06 *** defolos_ has joined channel #rce 21:06 縺薙s縺ー繧薙・ 21:06 *** New Mode for #rce by Pude2k: +o defolos_ 21:06 こんばんは 21:06 こんばんわ 21:06 >yuushi_q< こんばんわ 21:07 こんばんは 21:08 *** defolos has joined channel #rce 21:08 こんばんはー 21:08 *** defolos_ has left channel #rce (縺輔h縺・↑繧・ 21:09 *** New Mode for #rce by FCSAY: +o defolos 21:11 >yuushi_q< まずは、crackme02a.exeを普通に起動しましょう。 21:12 >yuushi_q< 適当にいじって前回との違いを探してください。 21:13 *** defolos has left IRC("さようなら") 21:13 >yuushi_q< 見た目は色が違うだけで、動作の違いは見受けられませんね。 21:14 >yuushi_q< では、一回プログラムを終了させて、前回と同様の手順で解析していきましょう。 21:14 *** defolos has joined channel #rce 21:14 *** New Mode for #rce by Pude2k: +o defolos 21:15 >yuushi_q< まず、「crackme02a.exe」をOllyDbgで開きます。 21:15 >yuushi_q< 皆さんここまでOKですか? 21:16 はい 21:16 はい 21:16 はい 21:16 開いたところまでOKです 21:16 大丈夫です 21:16 OKです 21:17 >yuushi_q< 画面左上の逆アセンブルリストの上で右クリックして「検索→ラベル一覧」を選択して下さい。 21:17 >yuushi_q< すると、ラベルネーム(命令リスト)が表示されるので、その中からGetWindowTextAを選択して下さい。 21:17 >yuushi_q< 次にGetWindowTextA上で右クリック「全ての参照をブレークポイントにセット」を選択して下さい。 21:17 >yuushi_q< すると、GetWindowTextA にブレークポイントがセットされるはずです。 21:17 >yuushi_q< ブレ−クポイントがセットされたところのアドレスラベルは赤くなります。 21:17 >yuushi_q< F9を押して、プログラムを実行してみましょう。 21:18 >yuushi_q< ウインドウがでましたか? 21:18 出ました 21:19 はい 21:19 はい 21:19 出ました 21:21 >yuushi_q< defolosさん、test__さん大丈夫ですか? 21:21 あ、今回私は無視して進めてくださいませ 21:22 Windows環境でないので、今回は聴講だけにいたします 21:22 はい 21:25 >yuushi_q< >>defolosさん http://security2600.sakura.ne.jp/up/img/795.txtを見てください。 21:25 >yuushi_q< 今回の逆アセンブリリストです。 21:25 ありがとうございます 21:26 >yuushi_q< では、続けます。 21:26 >yuushi_q< crackme#02a ウィンドウ上のパス入力欄に適当なパスワードを入れて登録ボタンを押します。 21:26 へんなのがでた 21:28 >yuushi_q< 皆さんも変なのでますか? 21:28 どこにブレークポイントかけたかとか分かるのか。 21:28 出ました 21:28 でます 21:28 変なエラーダイアログでました。 21:29 >yuushi_q< これでeagle0wlさんは予言者だとわかりますね。 21:29 笑 21:29 >yuushi_q< もちろん、そんなわけありません。何かトリックがあるはずです。 21:30 >yuushi_q< ここで今回のプログラムの流れを推測して見ましょう。 21:31 >yuushi_q< ダイアログボックスの表示の登録を押す 21:31 >yuushi_q< ↓ 21:31 >yuushi_q< BPちぇっく(BPがあればメッセージを表示) 21:31 >yuushi_q< ↓ 21:31 >yuushi_q< GetWindowText 21:31 >yuushi_q< ↓ 21:31 >yuushi_q< . 21:31 >yuushi_q< . 21:31 >yuushi_q< . 21:31 >yuushi_q< BPをチェックを先にするせいでGetWindowTextにたどり着く前にメッセージが表示され終了してしまいます。 21:32 >yuushi_q< もちろん、この段階では推測なので正しくないかもしれません。 21:33 >yuushi_q< そこで、今回のメインテーマはブレークポイントとは何ぞやということです。 21:34 >yuushi_q< OllyDbgに戻り、巻き戻しボタンみたいなボタンを押して、再スタートさせます。Ctrl+F2でも代用できます。 21:34 >yuushi_q< このコマンドは結構便利なので覚えときましょう。 21:35 >yuushi_q< ここまでOKですか? 21:35 はい。 21:35 大丈夫です 21:35 はい 21:35 はい 21:35 はい 21:36 はい 21:36 >yuushi_q< 先ほど、メッセージボックスが表示されたので、そこにブレークポイントをセットすれば、ブレークできると考えられます。 21:38 >yuushi_q< メッセージボックスはMessageBoxという関数によって呼び出されるので、そこに、先ほどと同様ブレークポイントを仕掛けます。 21:39 >yuushi_q< ただし、実際にはMessageBoxAというものがそれにあたります。 21:40 >yuushi_q< F9を押し、先ほどと同様に適当なパスワードをいれて、登録ボタンを押します。 21:41 >yuushi_q< 皆さん、ブレークしましたか? 21:41 しました 21:41 はい 21:41 はい 21:41 OKです 21:42 はい 21:42 はい 21:43 >yuushi_q< 0040122Cで止まりますね。 21:44 >yuushi_q< この前にBPチェックが行われているはずです。 21:46 >yuushi_q< ところどころにアドレスの横に> ^ $がありますね。 21:50 >yuushi_q< >はジャンプされうること、^はジャンプすること、$は関数?を示すようです。 21:50 >yuushi_q< 間違ってたらすみません。 21:51 あ、「>^$」とつながった文字列ではないのですね。 21:51 上に^ありました ^EBA7とか 21:51 単独の文字にそれぞれ意味がある、と。 21:51 理解しました。 21:51 >yuushi_q< そうです。わかりにくくてすみません。 21:52 いえいえ^^ 21:53 ^ が逆さまになったものもありますが、これはどういった意味なのでしょう? 21:53 >yuushi_q< それを踏まえてブレークしたところの上を見てみましょう。 21:53 はい 21:55 >yuushi_q< 004011E4にjmp命令があります。jmp命令は指定アドレスに強制ジャンプします。 21:56 >yuushi_q< つまり、004011E4とブレーク場所までにある4つの>は少なくとも、どれか一つは通ることになります。 21:57 >yuushi_q< ここまでの説明は大丈夫ですか? 21:57 はい。 21:57 はい 21:57 OKです 21:58 さっきの質問ですが、今のところ無視してよさそうならスルーしちゃってかまいません。 21:58 すみません。少なくともひとつ通る という理由が少しわからないのですが 21:59 >yuushi_q< ^の逆さまは条件付ジャンプのようです。 21:59 なるほど、ありがとうございます。 22:00 自分も、「どれか一つは通ることになる」という意味がよくわかりませんでした 22:02 4つの入口>のどこかは通過しないと、ブレイク場所にたどり着かないという意味でしょうか 22:02 ジャンプさせてメインのルーチンへということですかねぇ 22:03 JMPは強制ジャンプだから、4つの入口を通過しないと、ブレイク場所0040122Cには到達しないということで解釈しましたが大丈夫かな? 22:03 >の意味は、「> がついた場所へのジャンプ」がどこかにあるということで良いのかしら。 22:04 >yuushi_q< 004011E4の上はjmp命令な本来プログラムは上から下に進みますが、jmp命令があるせいで004011E4には到達しないためです。 22:05 たしかに 22:05 あ、なるほど 22:06 ジャンプ命令がなかったら正解にたどりついちゃいますね、 22:06 もしくはエラー 22:06 ん? なんか変なこといいました。スルーお願いします・・ 22:07 004011E4でかなり前に戻されるので、004011E4から下のどこかしらの>に飛ばされないとブレークポイントにたどり着かない 22:07 というわけですか 22:09 >yuushi_q< いえ、どこからでもいいので最低4つのうちのどれか一つへジャンプです。 22:10 なんとなく理解できた気がします^^; 22:10 >yuushi_q< 説明が悪いですね。あとで分かりやすくまとめときます。特殊な状況だと例外もありますが今回は無視します。 22:11 defolosさんの説明で合ってる? 22:11 たとえば START→不正解→正解→END  というPGMで 22:12 ジャンプしなかったらENDにいけない ということ? 22:12 *** noname0 has joined channel #rce 22:14 こんばんは 22:14 *** New Mode for #rce by Pude2k: +o noname0 22:14 こんばんわ 22:14 こんばんは 22:14 こんばんは。 22:14 こんばんは(irc良くわからないのですみません) 22:14 >yuushi_q< こんばんは 22:14 こんばんはー 22:14 今わかりました。続きどうぞm(__)m 22:15 >yuushi_q< 004011E9からブレークポイントまではプログラムとして孤立しています。(jmp命令のせいで前と繋がってない) 22:16 >yuushi_q< これは大丈夫ですか? 22:16 はい 22:16 あ、一つ気づいたことがあるんですが 22:17 はい 22:17 さっき言ってた ^ とその逆さまの記号についてなんですけど 22:17 条件付ジャンプか無条件ジャンプかではなく 22:18 前に飛ぶか後ろに飛ぶかのような気がするんですけども。 22:18 ほんとだ、ジャンプする方向ですね^^ 22:18 へぇ 22:18 おー。なるほど 22:18 違ったらごめんなさい>< 22:19 >yuushi_q< 本当だ! その通りのようです。 22:20 おー、これでだいぶ読めるようになってきた気がする(笑 22:21 >yuushi_q< Cや他の言語でも他とは孤立している処理があります。それは何でしょう? 22:21 ヒント!ください 22:21 関数? 22:21 関数? 22:21 ああ 22:22 初期宣言? 22:22 >yuushi_q< その通り、関数です。 22:22 なるほろ 22:22 そうだったんだぁ 22:25 >yuushi_q< よって004011E9からの処理は少なくとも関数の可能性が非常に高いです。 22:25 ほほー。なるほど 22:27 あのー、 22:27 ちょっといいですか? 22:27 >yuushi_q< OKです。 22:28 自分は401049から40127Fまでがウィンドウプロシージャではないかと思ったんですが。 22:29 そう思った理由は、 22:30 その後の命令でRETではなくジャンプ命令で4011DAにとばしてるから。 22:30 どうでしょうか・・・。 22:31 あー、ごめんなさい 22:31 勘違いだったみたいです 22:31 気にしないください。 22:34 やっぱり、訂正:4010A5から40127Fまで でウィンドウプロシージャ・・・?って気がします。(そのままスルーしちゃってくださいw 22:35 >yuushi_q< ウインドウプロシージャの開始場所はあっています。終わりは004010A2です。今回実はウインドウプロシージャから解析をしようかとも思っていたのですが、時間があまりましたらこちらの方法もやりましょう。 22:36 >yuushi_q< あっ、開始は401049でした。 22:36 ごめんなさい^^;あまりわかってないのに口出ししてしまって・・・。 22:36 あっ、ほんとだ、そうですね^^ 22:37 callwindowproAってかいてある 22:38 >yuushi_q< 話をもどして、実際に関数か確認してみましょう。>をクリックして右クリック->移動->Jxx 元へxxxxx を4つみてみましょう。 22:40 >yuushi_q< 004011E9以外はかなり近い場所、つまり関数内を指しています。 22:41 ふむふむ。 22:43 >yuushi_q< 逆に004011E9はなんか、jmpとかcmpとかいろいろある場所に着きます。ここではBPチェックはしてないようなので、BPチェックは004011E9からにはきめ打ちします。 22:43 >yuushi_q< ここまでよろしいでしょうか? 22:43 はい 22:43 はい 22:44 OKです 22:44 「ここではBPチェックはしてないようなので」ってのは何か根拠あります? 22:45 自分にとっては全然明らかじゃないもので(^^; 22:46 あ、ここでは=004011E9以降では、か。 22:46 読み間違えてました。すみません・・。 22:47 続きどうぞ。 22:47 >yuushi_q< いえいえ、はっきり言って根拠はないですね^ ^。この方法は一般的なアプローチです。もしBPチェックの場所を間違ってたら、修正すればいいという考えが根底にあります。 22:48 なるほど。 22:49 >yuushi_q< これじゃあ、スマートじゃないですね。「俺はカッコ良く、一発であてたい」という方に向けて別な方法をやりましょう。 22:50 >yuushi_q< もう一度再スタートさせましょう。 22:51 >yuushi_q< 401000が黒くなっています。ここがプログラムの開始地点です。 22:52 >yuushi_q< ここまでよろしいでしょうか? 22:52 はい 22:52 はい 22:52 はい 22:52 OKです 22:53 はい 22:53 >yuushi_q< さて、いろいろ関数が見えますが、ここで重要なのが、CallWindowProcAです。 22:56 >yuushi_q< あっ、間違えました。 DialogBoxParamAです。 22:58 >yuushi_q< ダイアログを作る関数です。見るところは、DlgProcです。ここにはウインドウプロシージャのアドレス入っています。 22:58 >yuushi_q< ここまでよろしいですか?  22:58 はい 22:59 はい 23:00 OKです 23:00 はい 23:00 はい 23:00 OKです 23:00 >yuushi_q< 皆さんウインドウプロシージャがどんなものか大丈夫ですか? 23:01 あやふやですが、なんとなくわかります 23:01 おなじく 23:01 自分も何となくわかります。 23:01 あんまり分かってないので、簡単に解説して頂けると助かります。 23:02 おなじく 23:02 おなじく、解説して頂けると助かります 23:04 >yuushi_q< ウインドウプロシージャはメッセージを取得する関数です。 23:05 >yuushi_q< 「マウスを移動した」、「クリックした」、「キーボードを押した」などの出来 23:05 >yuushi_q< 事をイベントと呼びます。 23:07 >yuushi_q< イベントが起きるとそれに対応したメッセージが発生します。そのメッセージを処理するのがウインドウプロシージャになります。 23:08 >yuushi_q< これで、よろしいですか? 23:09 はい。 23:09 OKです 23:11 >yuushi_q< では、今回取得すべきイベントは何でしょう? 答えはあなたがやったことにありますよね。 23:13 登録ボタンを押した? 23:13 「登録ボタンを押す」という行為ですか? 23:13 >yuushi_q< その通りです。 23:14 >yuushi_q< 現に、登録ボタンを押した後、すぐにブレークしましたよね。 23:17 >yuushi_q< では実際に「登録ボタンを押す」というイベントをさがしてみましょう。 23:19 >yuushi_q< 401049にウインドウプロシージャの先頭アドレスがあるのでそこからみます。 23:21 >yuushi_q< WinProc(HWND hWnd,UINT Message,WPARAM wParam,LPARAM, lParam); 23:21 >yuushi_q< ue 23:22 >yuushi_q< 上が、ウインドウプロシージャの関数の宣言例です。 23:23 >yuushi_q< 重要なのは、後ろ二つdesu.wParam 23:23 >yuushi_q< mata 23:24 >yuushi_q< また、途中で送信してしまいました、すみません。 23:25 >yuushi_q< 一般的にボタンを押すと、wParamにはWM_COMMAND(0x111)、lParamにはボタンのID 23:25 >yuushi_q< です。 23:26 >yuushi_q< ボタンIDは作者がある程度、勝手につけることができる数字です。 23:27 >yuushi_q< ここまで、OKですか? 23:27 はい 23:27 OKです 23:27 はい 23:27 はい 23:28 はい 23:28 はい 23:30 >yuushi_q< 表示->ウインドウをクリックして下さい。そこの登録と書いてあるところのIDがボタンのIDになります。 23:32 >yuushi_q< IDは0x3E8になります。一見、中途半端な数に見えますが、10進数に直すと数字の意味がわかりますね。 23:33 1000? 23:35 >yuushi_q< そうです。1000です。このように16<->10進数の変換で見えてくるものもあります。 23:37 >yuushi_q< 元に戻って、3E8を注意して探すと、00401063にCMP DWORD PTR SS:[EBP+10],3E8という物凄くあやしいものがみつかりますね。 23:40 >yuushi_q< [EBP+10]はlParamのことです。スタックについて、解説する時間がないんで、省略します。詳しくはdefolosさんのExploiting実習の資料とログで! 23:40 了解^^; 23:41 はい 23:42 OKです。 23:44 >yuushi_q< ボタンを押したとき、lParam==3E8なので、次のJNZはジャンプしません。その次のジャンプ先のアドレスを見てみると…… 23:44 さっきのとこですね。 23:46 >yuushi_q< そういうわけでさっきのところで、BPチェックの開始は間違ってませんね。 23:46 >yuushi_q< ここまでよろしいですか? 23:46 はい 23:46 OKです 23:47 はい 23:47 はい 23:48 JNZの次というのはJMPのところみればよいのでしょうか 23:48 >yuushi_q< 続きをやりたいところですが、まもなく明日になってしまいます。まだ先は長いので、次回に回しましょう。 23:49 アセンブラはところどころジャンプしてむずかしいですね 23:49 >yuushi_q< >>IPUSIRONさん そうです。0040106Cのジャンプです。 23:51 今日はこれで終わりですか? 23:52 >yuushi_q< そうですね。まだ自分はここに残っているので、聞きたいことがある人は残って、自由解散にしましょう。 23:52 ありがとうございましたー。 23:53 了解。ありがとうございました 23:53 了解です。 23:53 お疲れ様でした 23:53 お疲れ様でしたー。 23:53 ありがとうございました 23:53 次回はいつごろになりそうですか? 23:53 >yuushi_q< どういたしまして。 23:54 >yuushi_q< 今月中にしましょう。あまり長くなると忘れるんで。 23:54 はい