**** Sun Mar 2 04:44:30 2008 からログ記録開始 3月 02 04:44:30 * Now talking on #lykeion 3月 02 04:47:00 Defolos_ test 3月 01 20:16:29 * h4ox (~h4oxdb@p1044-ipbf2009hodogaya.kanagawa.ocn.ne.jp) has joined #lykeion 3月 01 20:16:53 h4ox こんばんわ 3月 01 20:17:29 h4ox すいません、時間外に。接続のテストを行っていました。 3月 01 20:18:21 h4ox 本日はどうぞよろしくお願いいたします。以前にメッセージをおくらさせていただいた、h4oxと申します。 3月 01 20:19:16 h4ox 再度時間がきたら最接続させていただきます。 3月 01 20:19:21 h4ox では失礼します。 3月 01 20:20:41 * h4ox (~h4oxdb@p1044-ipbf2009hodogaya.kanagawa.ocn.ne.jp) has left #lykeion 3月 01 20:22:19 * be-be- (~be_be_@cririn.firefly.kutc.kansai-u.ac.jp) has joined #lykeion 3月 01 20:48:42 * kotto (~username@p5159-ipad203yosida.nagano.ocn.ne.jp) has joined #lykeion 3月 01 20:48:48 kotto こんばんは 3月 01 20:49:25 be-be- こんばんは 3月 01 20:50:24 Defolos_ こんばんはー 3月 01 20:54:52 * yuushi_q (~gateway@ntsitm294177.sitm.nt.ftth.ppp.infoweb.ne.jp) has joined #lykeion 3月 01 20:55:08 Defolos_ こんばんは 3月 01 20:55:28 be-be- こんばんは 3月 01 20:58:02 * FCSAY (~fcsay@211.121.30.125.dy.iij4u.or.jp) has joined #lykeion 3月 01 20:58:11 FCSAY こんばんわ 3月 01 20:58:19 Defolos_ こんばんはー 3月 01 20:58:23 yuushi_q こんばんは 3月 01 20:58:28 yuushi_q こんばんは 3月 01 20:58:44 yuushi_q こんばんは 3月 01 21:01:37 * h4ox (~h4oxdb@p1044-ipbf2009hodogaya.kanagawa.ocn.ne.jp) has joined #lykeion 3月 01 21:01:38 yuushi_q 現在PC仕様不能のため、本日は聴講のみとさせて頂きます。 3月 01 21:01:47 Defolos_ 了解しましたー 3月 01 21:01:48 yuushi_q 現在PC使用不能のため、本日は聴講のみとさせて頂きます。 3月 01 21:01:55 h4ox こんばんわ。 3月 01 21:01:59 Defolos_ こんばんは 3月 01 21:02:01 FCSAY こんばんわ 3月 01 21:02:27 Defolos_ さて、ではそろそろはじめましょうか 3月 01 21:02:28 h4ox 皆様始めまして、h4oxと申します。 今日はどうぞよろしくお願いいたします。 3月 01 21:02:35 Defolos_ どうぞよろしくお願いします 3月 01 21:02:46 FCSAY よろしくおねがいします。 3月 01 21:03:17 be-be- よろしくお願いします 3月 01 21:03:31 Defolos_ それでは、資料をアップしておきましたので 3月 01 21:03:37 Defolos_ http://ruffnex.oc.to/defolos/exploiting/exploiting_practice/data/exploiting-07.html 3月 01 21:03:43 Defolos_ にアクセスしてください 3月 01 21:03:46 yuushi_q 多重投稿すみません。 3月 01 21:03:52 Defolos_ いえいえ 3月 01 21:04:27 Defolos_ 資料の目次が毎度おかしいのですが 3月 01 21:04:40 Defolos_ 今回もちゃんと書けてないですTT 3月 01 21:04:44 Defolos_ 申し訳ありません 3月 01 21:05:08 Defolos_ 質問は随時お願いしますね 3月 01 21:05:23 Defolos_ ではまず、スタック構造のところを御覧ください 3月 01 21:05:52 Defolos_ 今までスタックがどうことか、スタックセグメントがどうことか言って来ましたが 3月 01 21:06:04 Defolos_ スタック自体の説明がまだでした。^^; 3月 01 21:06:34 Defolos_ スタックとは代表的なデータ構造のひとつなのですが 3月 01 21:06:49 Defolos_ 情報科学とかアルゴリズムとかでは大変重要な概念です 3月 01 21:07:01 Defolos_ どんな構造かと言いますと 3月 01 21:07:25 Defolos_ はじめに入れたものから順番に取り出すという 3月 01 21:07:48 Defolos_ first in first out略してFIFOと呼ばれます 3月 01 21:08:04 Defolos_ 一番身近な例では 3月 01 21:08:15 Defolos_ スーパーのカートってありますよね 3月 01 21:08:50 Defolos_ 買物カゴをのせるやつです 3月 01 21:09:11 Defolos_ カートはカート置場にまとめて老いてありますが 3月 01 21:09:21 Defolos_ 置いてありますが;; 3月 01 21:09:47 Defolos_ 普通は一番先っ歩のところから取り出しますよね 3月 01 21:10:15 Defolos_ 真中のほうにあるカートを無理矢理取り出してる人はあんまり見かけないと思います 3月 01 21:10:34 Defolos_ これが図で言うとfig.7-1の上のやつですね 3月 01 21:10:46 Defolos_ あ、間違えた下のやつです 3月 01 21:10:52 Defolos_ すみません 3月 01 21:11:08 Defolos_ で、買物を終えて、カートを戻すときは 3月 01 21:11:23 Defolos_ 一番先っ歩の方にカートを積みますよね 3月 01 21:11:49 Defolos_ まぁ、中には買物を終えたら放置する人もいますけど 3月 01 21:12:10 Defolos_ 普通は一番端に戻しますよね 3月 01 21:12:28 Defolos_ これがfig.7-1の上のやつです 3月 01 21:13:04 Defolos_ あ、ごめんなさい。図を2つに分けて説明してるんだった 3月 01 21:13:27 Defolos_ fig.7-1の下のやつというのをfig.7-2に置き換えてください 3月 01 21:13:44 Defolos_ 実際のデータで話をしますと 3月 01 21:14:31 Defolos_ 3、4、7をスタックにいれて、ひとつデータを取り出した後に1をスタックに格納する 3月 01 21:14:34 Defolos_ と言う場合 3月 01 21:14:44 Defolos_ 3、4、7とデータが積まれ 3月 01 21:14:55 Defolos_ 最後にいれた7が取り出されます 3月 01 21:15:09 Defolos_ この時点でスタックは3、4となっているので 3月 01 21:15:26 Defolos_ この後に1をスタックにいれると3、4、1というようになります 3月 01 21:15:43 Defolos_ スタックからデータを取り出す作業はPOPと呼ばれ 3月 01 21:15:53 Defolos_ 逆に格納する作業はPUSHと呼ばれます 3月 01 21:16:23 Defolos_ このスタックは今回のキーポイントである「関数呼び出し」に無くてはならない重要な概念なのです 3月 01 21:16:30 Defolos_ ここまではOKでしょうか 3月 01 21:16:38 FCSAY えと、すみません 3月 01 21:16:46 Defolos_ はい 3月 01 21:16:49 FCSAY アルゴリズムの部分はいいと思うんですが 3月 01 21:16:56 FCSAY これ、LIFOの話だと思います 3月 01 21:17:04 Defolos_ あ 3月 01 21:17:11 Defolos_ 本当だ 3月 01 21:17:17 Defolos_ ごめんなさい>< 3月 01 21:17:23 FCSAY いえいえ 3月 01 21:17:28 Defolos_ FIFOはキューと呼ばれる 3月 01 21:17:38 Defolos_ もう一つスタックと対立するデータ構造の話でした 3月 01 21:17:54 Defolos_ スタックはlast in first outで 3月 01 21:18:08 Defolos_ FCSAYさんのおっしゃるようにLIFOと呼ばれます 3月 01 21:18:34 Defolos_ 最後にいれたものを最初に取り出すという意味ですね 3月 01 21:18:54 Defolos_ 他にはありませんでしょうか 3月 01 21:19:31 h4ox 私は大丈夫です。 3月 01 21:19:34 FCSAY OKだと思います 3月 01 21:19:44 be-be- 大丈夫です 3月 01 21:20:01 Defolos_ では、次に移りたいと思います ミスが多くて申し訳ありませんです 3月 01 21:20:09 yuushi_q 大丈夫です。 3月 01 21:20:20 Defolos_ 次は関数呼び出しについてです 3月 01 21:20:43 Defolos_ 関数と言うのはこれまでも数多使って来ましたが 3月 01 21:21:02 Defolos_ 例えばprintfやgetsなどですね 3月 01 21:21:16 Defolos_ これは簡単に言うと、仕事を分割するための機能です 3月 01 21:21:38 Defolos_ 細かいことを下請けに任せるような感じですね 3月 01 21:21:45 Defolos_ 具体例を挙げますと 3月 01 21:21:57 Defolos_ A社との契約をとる という仕事があるとします 3月 01 21:22:43 Defolos_ これはさらに、「アポをとる」「プレゼンをする」「契約書の提示」というような仕事に分けられます 3月 01 21:23:13 Defolos_ さらに、アポをとるという仕事も電話をかけたり、上司と相談したりといったより細かい仕事に分けられます 3月 01 21:23:34 Defolos_ これらの仕事の分割みたいなものが関数です 3月 01 21:23:54 Defolos_ 関数があると何が嬉しいのか、といいますと 3月 01 21:24:15 Defolos_ 仕事の細かい所を気にしなくて良くなるというのが挙げられます 3月 01 21:24:31 Defolos_ 大まかな流れを考えればよいので 3月 01 21:24:48 Defolos_ 仕事をする効率は上がります 3月 01 21:24:59 Defolos_ ちょっと余談になるのですが 3月 01 21:25:21 Defolos_ 構造化プログラミングというダイクストラ氏が提唱したプログラミングスタイルというのがあります 3月 01 21:25:27 * PudeXp (~Pude@i121-114-245-85.s02.a015.ap.plala.or.jp) has joined #lykeion 3月 01 21:25:32 Defolos_ こんばんはー 3月 01 21:25:38 PudeXp こんばんは 3月 01 21:25:42 kotto こんばんは 3月 01 21:25:43 FCSAY こんばんわ 3月 01 21:25:45 h4ox こんばんわ 3月 01 21:25:48 PudeXp 遅くなりました(汗 3月 01 21:25:49 Defolos_ 資料はhttp://ruffnex.oc.to/defolos/exploiting/exploiting_practice/data/exploiting-07.htmlよりDLください 3月 01 21:26:02 Defolos_ 今、関数呼び出しの所ですので 3月 01 21:26:04 yuushi_q こんばんは 3月 01 21:26:07 be-be- こんばんは 3月 01 21:26:46 Defolos_ ぷでさん、準備OKですか? 3月 01 21:26:52 PudeXp はい。 3月 01 21:26:57 Defolos_ では続けますね 3月 01 21:27:09 PudeXp 構わずすすめてくださってOKです。 3月 01 21:27:14 Defolos_ 構造かプログラミングの骨子は 3月 01 21:27:28 Defolos_ GOTOを使わないというものと 3月 01 21:27:35 Defolos_ 関数を活用しようというものです 3月 01 21:28:03 Defolos_ このように、現在広く認知されている構造化プログラミングにおいてもその重要性が示されているぐらい 3月 01 21:28:14 Defolos_ 関数と言う概念は便利な物なのです 3月 01 21:28:40 Defolos_ そのため、現在のプログラミング言語では使える言語がほとんです 3月 01 21:29:02 Defolos_ アセンブリでもCALL命令なんて命令があって、関数呼び出しっぽいことができます 3月 01 21:29:21 Defolos_ それで、関数の特徴としては 3月 01 21:29:39 Defolos_ 呼び出した後はもとの場所に戻って来ると言うのがありますね 3月 01 21:29:56 Defolos_ 例えばprintfを呼び出したらそれでプログラムが終るわけではなく 3月 01 21:30:11 Defolos_ ちゃんとprintfの次の命令をやってくれます 3月 01 21:30:37 Defolos_ 資料に挙げたソースコードも関数呼び出しのサンプルなのですが 3月 01 21:31:34 Defolos_ func関数が呼ばれた後も、funcでやることが全部終ったら次のvar2 = 8;って行を実行してくれます 3月 01 21:32:04 Defolos_ つまり、呼び出した後に戻って来れるということは 3月 01 21:32:26 Defolos_ どこかに、どこに戻って来るべきなのかという情報を保存している 3月 01 21:32:29 Defolos_ ということですね 3月 01 21:32:53 Defolos_ ここまでは大丈夫でしょうか 3月 01 21:32:59 FCSAY 大丈夫です 3月 01 21:33:02 PudeXp OKです 3月 01 21:33:05 h4ox はい、大丈夫です。 3月 01 21:33:30 be-be- OKです 3月 01 21:33:56 Defolos_ では次に行きますね 3月 01 21:34:25 Defolos_ どこに戻って来るかという情報は 3月 01 21:34:45 Defolos_ スタックフレームという構造で定義されています 3月 01 21:34:56 Defolos_ スタックフレームと言うのは 3月 01 21:35:16 Defolos_ 引数、戻りアドレス、待避済みフレームポインタ、ローカル変数という5つの要素からなる構造です 3月 01 21:35:36 Defolos_ 名前の通り、スタックに積まれた構造なのです 3月 01 21:35:51 Defolos_ どんどん必要な情報をPUSHすることで構成されて行きます 3月 01 21:36:04 Defolos_ まず、関数を呼ぶときには 3月 01 21:36:14 Defolos_ その関数の引数をPUSHします 3月 01 21:36:35 Defolos_ func(var1, var2)だと、左側のvar1からvar2と積まれます 3月 01 21:37:01 Defolos_ 次に戻りアドレスという、次に実行すべき命令へのアドレスをPUSHします 3月 01 21:37:17 Defolos_ 前のサンプルの例だとvar2 = 8のアドレスですね 3月 01 21:37:57 Defolos_ その次に、フレームポインタをPUSHします 3月 01 21:38:08 Defolos_ これはSEPと呼ばれます 3月 01 21:38:41 Defolos_ フレームポインタは、深く考えないで、必要な情報だと考えてください 3月 01 21:38:55 Defolos_ 最後にローカル変数をPUSHします。 3月 01 21:39:14 Defolos_ 関数内で使う変数を宣言順にPUSHしていきます。 3月 01 21:39:45 Defolos_ ただし、領域を確保するだけで、実際には何のデータもPUSHされないので注意ください 3月 01 21:40:14 Defolos_ 関数を呼び出したときはfig.7-3みたいになります 3月 01 21:40:32 Defolos_ 戻りアドレスとかSEPとかは適当な値ですけど 3月 01 21:40:41 Defolos_ 大体こんな感じのアドレスになります 3月 01 21:40:56 Defolos_ 関数の中でさらに関数を呼び出すと 3月 01 21:41:28 Defolos_ さらに先程積んだ情報の上にスタックフレームが積まれます 3月 01 21:41:40 Defolos_ fig.7-4がそれなのですけど 3月 01 21:42:00 Defolos_ func()領域の上にfunc2()の領域がありますね 3月 01 21:42:41 Defolos_ 呼び出した後、関数でやるべきことが全部終ったら、スタックフレームをとりのぞきます 3月 01 21:42:51 Defolos_ ローカル変数は全部消されます 3月 01 21:43:12 Defolos_ 次に、スタックの一番上に出て来るSEPの値をEBPというレジスタにいれます 3月 01 21:43:22 Defolos_ で、SEPを取り除きます 3月 01 21:43:32 Defolos_ そうすると一番上には戻りアドレスがくるので 3月 01 21:43:47 Defolos_ その値を次に実行するアドレスをいれるレジスタにいれます 3月 01 21:44:09 Defolos_ で、後はfunc2が使ってたやつを全部消します 3月 01 21:44:27 Defolos_ fig.7-5がその時の図です 3月 01 21:44:48 Defolos_ で、その後はfunc関数の処理を続け 3月 01 21:45:03 Defolos_ funcでもやることが無くなったら同じことをします 3月 01 21:45:44 Defolos_ スタックを使うことで、一番上のやつだけを注目すればよくなるので 3月 01 21:46:03 Defolos_ 関数呼び出しにスタックがうってつけなのです 3月 01 21:46:25 Defolos_ さて、ここで一番興味がわくところは戻りアドレスですね 3月 01 21:46:49 Defolos_ 戻りアドレスをちゃんと覚えているというのがここでのポイントです 3月 01 21:47:11 Defolos_ 戻りアドレスなのですが 3月 01 21:47:45 Defolos_ これはプログラムの流れを管理する重要な値だということが御理解頂けた事と思います 3月 01 21:48:07 Defolos_ プログラムの流れを変更して、シェルを起動させるプログラムを実行する事で 3月 01 21:48:17 Defolos_ 権限を奪う事ができると以前述べましたが 3月 01 21:48:35 Defolos_ これを実現するには戻りアドレスが鍵になりそうだなとわかりますね 3月 01 21:49:07 Defolos_ 戻りアドレスをうまく書き換えて、処理の流れを自由自在に操れれば 3月 01 21:49:19 Defolos_ さぞ楽しいことでしょう 3月 01 21:49:40 Defolos_ で、前回はローカル変数の書き換えというのをやったのですが 3月 01 21:49:47 Defolos_ あれを思い出してください 3月 01 21:49:58 Defolos_ 前回のは文字列関数を使って 3月 01 21:50:13 Defolos_ メモリ高位にある変数の値を書き換えましたね 3月 01 21:50:24 Defolos_ スタックフレームの構造を見ると 3月 01 21:50:39 Defolos_ 戻りアドレスがローカル変数より高位に置かれます 3月 01 21:51:02 Defolos_ つまり、前回と同じようなやり方で戻りアドレスが上書きできてしまうのです 3月 01 21:51:22 Defolos_ 前回は課題6.1というのをやったのですが 3月 01 21:51:40 Defolos_ どうなるか考えて来られた方はいらっしゃいますか? 3月 01 21:52:25 Defolos_ 実は、17文字とか言ってましたが 3月 01 21:52:35 Defolos_ 全然上書きには足りませんでしたTT 3月 01 21:52:43 Defolos_ 実験してみた結果 3月 01 21:53:01 Defolos_ 25文字目からscore変数が上書きされます 3月 01 21:53:32 Defolos_ ちょっとname配列とscore変数との間に溝があったらしく 3月 01 21:53:59 Defolos_ 25文字目以降からscoreが上書きされ、 3月 01 21:54:19 Defolos_ 44文字目からセグメンテーションフォルトというのが表示されます 3月 01 21:54:47 Defolos_ aという文字を入力しまくると 3月 01 21:55:17 Defolos_ score変数やらstage変数やら、先程のSEPを上書きして行き 3月 01 21:55:30 Defolos_ さらに戻りアドレスまで上書きされてしまいます 3月 01 21:55:51 Defolos_ 戻りアドレスが aaaa と言う具合に上書きされちゃう分けですが 3月 01 21:56:06 Defolos_ aはASCII文字コードで0x41なので 3月 01 21:56:18 Defolos_ 41414141という値に上書きされます 3月 01 21:56:39 Defolos_ で、main関数が終る時は 3月 01 21:57:08 Defolos_ 戻りアドレスの値を取り出して次に実行すべき場所レジスタに格納し 3月 01 21:57:13 Defolos_ そのアドレスを実行します 3月 01 21:57:31 Defolos_ 41414141番地は実行が許されていない場所なので 3月 01 21:57:39 Defolos_ セグメンテーションフォルトが発生するのです 3月 01 21:58:14 Defolos_ どこかにペイロードを格納しておき、戻りアドレスをうまくペイロードを格納している場所に上書きできれば 3月 01 21:58:21 Defolos_ ペイロードを実行する事ができるのです 3月 01 21:58:55 Defolos_ ここまではOKでしょうか 3月 01 21:59:10 be-be- はい大丈夫です 3月 01 21:59:20 FCSAY OKです 3月 01 21:59:29 PudeXp OKです 3月 01 21:59:31 h4ox 大丈夫です。 3月 01 21:59:46 yuushi_q OKです。 3月 01 21:59:49 Defolos_ では次に行きますね 3月 01 22:00:07 Defolos_ ペイロードをどこかに格納すると言う風に言いましたが 3月 01 22:00:16 Defolos_ どこに格納するのかは重要ですね 3月 01 22:00:43 Defolos_ メモリのどこにでも置いてOKと言う分けではなく 3月 01 22:00:57 Defolos_ 実行が可能なメモリの場所に入れておかなければ 3月 01 22:01:08 Defolos_ 結局セグメンテーションフォルトになってしまう分けですから 3月 01 22:01:25 Defolos_ 例えば、テキストセグメントにペイロードを格納しても 3月 01 22:01:40 Defolos_ あ、間違えた。データセグメントです 3月 01 22:02:01 Defolos_ データセグメントは実行が許可されていないので、セグメンテーションフォルトになってしまいます 3月 01 22:02:34 Defolos_ どこが一番便利かと言うと、スタックセグメントが挙げられます 3月 01 22:02:47 Defolos_ スタックセグメントは実は実行が可能なセグメントなのです 3月 01 22:03:22 Defolos_ なので、スタックに確保されたローカル配列に格納するのが楽です 3月 01 22:03:52 Defolos_ 他にも環境変数と言う、いろいろな情報を格納しておくメモリの場所に入れておく事もできます 3月 01 22:04:08 Defolos_ 環境変数もスタックセグメントの下の方に確保されています 3月 01 22:04:34 Defolos_ ただ、普通はスタックセグメントでプログラムを実行する事は考えられません 3月 01 22:05:12 Defolos_ テキストセグメントに実行すべき手順を置いて、一時的な変数を置くためにスタックは利用しますが 3月 01 22:05:30 Defolos_ スタックに実行すべき手順を置くことは異常ですので 3月 01 22:05:49 Defolos_ 最近のUNIXはスタックでプログラムを実行するのを禁止していたりします 3月 01 22:06:09 Defolos_ まぁ、デビアンはデフォルトではそう言ったことはしないので 3月 01 22:06:15 Defolos_ 練習には敵していますね 3月 01 22:06:39 Defolos_ これまでの説明は前回のゲームプログラムを使って来ましたが 3月 01 22:07:05 Defolos_ 次の説明はちょっとゲームプログラムではしにくいので、第一回で出て来たやつを使います 3月 01 22:07:19 Defolos_ あ、ちなみに 3月 01 22:08:00 Defolos_ ゲームプログラムはSAS_Workspaceに6_game.exeとして作ってますので 3月 01 22:08:08 Defolos_ 試したい方はどうぞ 3月 01 22:08:14 Defolos_ ゲームルーチンは無いですけどね 3月 01 22:08:28 Defolos_ で、第一回のターゲットプログラムは 3月 01 22:08:38 Defolos_ 500バイトしかないバッファに引数として渡された文字列をコピーするプログラムでした 3月 01 22:08:59 Defolos_ つまり、500文字以上入力したらおかしくなりまs 3月 01 22:09:42 Defolos_ 500何文字かで戻りアドレスが上書きされるのですが 3月 01 22:10:18 Defolos_ このときに上書きする値として、bufferの先頭を指すアドレスを上書きするように頑張ります 3月 01 22:10:43 Defolos_ すると、関数での処理が終ったときにbufferの先頭部に処理が移されます 3月 01 22:10:55 Defolos_ bufferの先頭にペイロードを格納しておけば 3月 01 22:11:05 Defolos_ ペイロードに処理が移る分けです 3月 01 22:11:13 * Mons00n (~Mons00n@vfppp079167161098.dsl.hol.gr) has joined #lykeion 3月 01 22:11:18 Defolos_ こんにちは 3月 01 22:11:20 * Mons00n (~Mons00n@vfppp079167161098.dsl.hol.gr) has left #lykeion 3月 01 22:11:33 Defolos_ あれ?^^; 3月 01 22:11:34 FCSAY こんばんわ 3月 01 22:11:57 Defolos_ えと、続けますね 3月 01 22:12:24 Defolos_ で、bufferはスタック領域に確保されたローカル配列ですので 3月 01 22:12:29 Defolos_ 先程言ったように実行が可能です 3月 01 22:12:41 Defolos_ 結果としてペイロードに書かれた内容が実行されるのです 3月 01 22:13:07 Defolos_ fig.7-7はそのイメージです 3月 01 22:13:45 Defolos_ ペイロードとして第5回で作ったものを利用洲とすると 3月 01 22:14:06 Defolos_ fig.7-8のような感じで 3月 01 22:14:19 Defolos_ って、ラベルが抜けてるTーT 3月 01 22:14:36 Defolos_ ★ターゲットプログラムの実行時のメモリ 3月 01 22:14:40 Defolos_ とか書いてるやつです 3月 01 22:14:49 Defolos_ ターゲットプログラムが実行されると 3月 01 22:15:08 Defolos_ ここでは例ですが、0000という番地にbuffer配列が確保されます 3月 01 22:16:19 Defolos_ ここに、文字列として「シェルコード33バイト、後は適当、戻りアドレスになる部分に0000」という文字列を渡すと 3月 01 22:16:31 Defolos_ 戻りアドレスが0000に上書きされて 3月 01 22:16:46 Defolos_ シェルコードの先頭が実行されて行きます 3月 01 22:17:03 Defolos_ こんな感じでペイロードが起動できる分けです 3月 01 22:17:10 Defolos_ では、実際にやってみましょうか 3月 01 22:17:18 Defolos_ SSHサーバにログインください 3月 01 22:17:33 Defolos_ ドメインはglazheim.mydns.jpで 3月 01 22:18:03 Defolos_ 始めて入る方はユーザ名は小文字でSASに登録してもらってる名前 3月 01 22:18:11 Defolos_ パスワードは「sas」です 3月 01 22:18:58 h4ox すいませんDefolosさん。 以前に聴講でお願いしますと言っていたのですが、よかったら私もアクセスしてもよろしいですか?  3月 01 22:19:05 Defolos_ はい 3月 01 22:19:11 Defolos_ 実はアカウントも作ってますので 3月 01 22:19:24 Defolos_ h4oxというアカウント名で 3月 01 22:19:28 Defolos_ ログインください 3月 01 22:19:42 h4ox あ、ありがとうございます。  3月 01 22:20:07 FCSAY なぜかユーザ認証に失敗します 3月 01 22:20:17 FCSAY 使ってるクライアントが悪いかな…… 3月 01 22:20:19 Defolos_ Σ 3月 01 22:20:21 h4ox すいません、私もユーザ認証で失敗します… 3月 01 22:20:29 h4ox 使用しているのはteratermです。 3月 01 22:20:32 PudeXp 自分はアカウントあるでしょうか? 3月 01 22:20:36 Defolos_ なんてエラー出てます? 3月 01 22:20:40 kotto 私は成功しました 3月 01 22:20:43 FCSAY poderosa使ってます 3月 01 22:20:50 be-be- 私も成功しました 3月 01 22:21:30 FCSAY エラーメッセージ自体は見えないんですよ、poderosaだと 3月 01 22:21:38 FCSAY ちょっとputty落としてきます 3月 01 22:21:39 Defolos_ あ、そうなんですか 3月 01 22:21:51 Defolos_ お手数かけます/// 3月 01 22:21:53 h4ox エラーメッセージは発生せず、入力したパスワードがクリアされます<teraterm 3月 01 22:22:04 Defolos_ あ 3月 01 22:22:09 Defolos_ それはもしかしたら 3月 01 22:22:16 Defolos_ その振舞がデフォルトなのかも 3月 01 22:22:22 Defolos_ パスワードは見えないように 3月 01 22:22:34 Defolos_ 表示されない仕組みになってるのかも 3月 01 22:22:52 Defolos_ 見えないけどsasとうちこんで、エンター押してみてください 3月 01 22:23:29 h4ox 打ち込んでエンターでも駄目です… あと、一度自分の家のサーバーを踏み台にしてから試して見たのですが同じくアクセスできません 3月 01 22:23:50 Defolos_ TT 3月 01 22:23:55 PudeXp 自分のアカウントは・・・ありますか? 3月 01 22:23:55 h4ox The authenticity of host 'glazheim.mydns.jp (219.104.12.65)' can't be established. 3月 01 22:23:57 h4ox RSA key fingerprint is b9:cd:6c:ee:e1:2b:87:73:00:8d:81:82:0a:57:56:51. 3月 01 22:24:12 PudeXp pude : sas で入れない・・・。 3月 01 22:24:20 h4ox 踏み台の方ではこういったエラーメッセージが発生しました。 RSAキーが設定されていない…? 3月 01 22:24:21 FCSAY Access Denied 3月 01 22:24:21 Defolos_ ちょっとまってね 3月 01 22:24:37 FCSAY Using keyboard-interactive authentication. 3月 01 22:24:53 Defolos_ pudeさん、sasにパスワード設定しました 3月 01 22:25:02 kotto h4oxさんとfcsayさんのフォルダのグループユーザがSASじゃないように見えますがそれは関係ないですか? 3月 01 22:25:25 Defolos_ うーん。一応GIDはSASにしてるんですが 3月 01 22:25:30 PudeXp ありがとうございます 3月 01 22:25:33 PudeXp はいれました 3月 01 22:25:37 Defolos_ はい 3月 01 22:26:08 Defolos_ RSA key fingerprintは使ってないのですが 3月 01 22:26:22 Defolos_ パスワード入力だけではダメでしたか 3月 01 22:26:24 h4ox Permission denied (publickey,keyboard-interactive).  3月 01 22:26:37 h4ox 何度か試したら上記メッセージが出ました。 3月 01 22:26:55 Defolos_ 許可が無い。ですね;;; 3月 01 22:28:10 h4ox すいません、ping自体が飛びません… 3月 01 22:28:17 Defolos_ ! 3月 01 22:28:27 h4ox こっちのファイアーウォールか…? ちょっと殺します。 3月 01 22:28:37 Defolos_ すみません 3月 01 22:28:55 Defolos_ 219.104.12.65 3月 01 22:28:59 Defolos_ でアクセスください 3月 01 22:29:41 Defolos_ 毎度、ログインで手間とらせてしまって申し訳ありません 3月 01 22:31:18 -FCSAY/#lykeion- Access denied 3月 01 22:31:19 -FCSAY/#lykeion- Using keyboard-interactive authentication. 3月 01 22:31:25 FCSAY って、出ます 3月 01 22:31:26 h4ox とりあえず、市販ファイアーウォールを殺しても駄目でした。  3月 01 22:31:44 Defolos_ おかしいですねTT 3月 01 22:32:34 h4ox winの火壁も殺してpingを打ってみたんですが…駄目ですorz 3月 01 22:32:44 h4ox ルーターの設定とか関係あるのでしょうか… 3月 01 22:32:51 Defolos_ うーん 3月 01 22:33:02 Defolos_ そちらのルータには影響無いはずなんですが 3月 01 22:33:14 Defolos_ IP直打ちでもダメでした? 3月 01 22:33:24 FCSAY 自分もping飛びませんが、ユーザ名とパスワード聞かれてるから大丈夫だと思ってるんですが…… 3月 01 22:33:29 h4ox 直打ちでも駄目でした… 3月 01 22:33:43 h4ox あ、同じくユーザー名とパスワードは聞かれています。 3月 01 22:34:15 h4ox pingの方は、火壁か何かで殺されてるだけですかね<そちらの 3月 01 22:36:21 h4ox ルートのトレースを行ってみたんですが、途中から経路が表示されないです… 3月 01 22:36:48 Defolos_ んー。なんでなんだろう 3月 01 22:36:59 yuushi_q よくわかりませんが、こんなのがありました。 3月 01 22:37:09 yuushi_q http://www.jun2065.net/index.php?Linux%B4%D8%CF%A2%2FSSH%A4%CE%C0%DC%C2%B3%A5%A8 3月 01 22:37:15 Defolos_ トレースは返さないように設定してるサーバの性かも 3月 01 22:38:07 kotto えっと 3月 01 22:38:16 Defolos_ はい 3月 01 22:38:18 kotto GIDはstaffのままでいいんですか? 3月 01 22:38:30 h4ox プロパイダ以降表示されていないので、たぶんプロパイダがトレースを許可してないみたいです<routetrace 3月 01 22:38:41 kotto Permission deniedならとりあえず権限疑うべきだと思うのですが・・・ 3月 01 22:38:48 Defolos_ なるほど 3月 01 22:39:19 FCSAY パケットキャプチャしたところ何らかの会話はしてるので通信の問題ではないと思います。 3月 01 22:42:46 Defolos_ FCSAYさん 3月 01 22:42:52 Defolos_ 一度ログインしてみてください 3月 01 22:43:02 FCSAY 了解です 3月 01 22:43:06 Defolos_ ホームディレクトリの権限をSASにしました 3月 01 22:43:49 Defolos_ h4oxさんも変更しました 3月 01 22:44:40 h4ox すいません、症状変わらずです… 3月 01 22:44:51 FCSAY 同じく変わりません 3月 01 22:45:02 Defolos_ TT 3月 01 22:45:49 Defolos_ ごめんなさい、なんでか全然検討付かないです;; 3月 01 22:46:14 h4ox http://www.itmedia.co.jp/help/tips/linux/l0542.html 3月 01 22:46:38 h4ox こんな情報がありましたがこれでしょうか。 私はこの方法で接続してます。 3月 01 22:47:00 Defolos_ お願いします 3月 01 22:48:02 h4ox あ、すいません。これはDeflosさんのsshdの設定を変更しないといけないみたいです… 3月 01 22:48:29 Defolos_ やってみました 3月 01 22:48:41 h4ox さらにすいません。お名前間違えました…orz > Defolosさん 3月 01 22:48:50 h4ox はいれましt! 3月 01 22:48:54 Defolos_ おおお 3月 01 22:48:58 Defolos_ やった 3月 01 22:49:06 Defolos_ 情報ありがとうございました= 3月 01 22:49:18 h4ox いえ、お手数おかけしてすいませんでした。 3月 01 22:49:43 FCSAY を、入れましたs 3月 01 22:49:46 Defolos_ おお= 3月 01 22:49:55 Defolos_ どうやらこちらの設定がおかしかったようですね 3月 01 22:50:01 Defolos_ 御迷惑お掛けしました 3月 01 22:50:14 Defolos_ それでは、ちょっと時間オーバーしちゃいそうなんですが 3月 01 22:50:18 h4ox いえ、ありがとうございました。 3月 01 22:50:21 Defolos_ 次行きましょうか 3月 01 22:51:10 Defolos_ /home/SAS_Workspaceに7_bof.cというのがありまs 3月 01 22:51:21 Defolos_ これを各自のホームディレクトリにコピーして 3月 01 22:51:35 Defolos_ gcc -Wall -o bo-test.exe 7_bof.c 3月 01 22:51:41 Defolos_ してコンパイルください 3月 01 22:52:07 Defolos_ これを実行すると 3月 01 22:52:33 Defolos_ bof sp = bffff668 という風に表示されます 3月 01 22:52:46 h4ox すいません…文字化けがorz 3月 01 22:52:59 Defolos_ あ、SSHの方ですか? 3月 01 22:53:04 h4ox はい。 3月 01 22:53:32 h4ox あ、すいません。自己解決できました 3月 01 22:53:39 Defolos_ 了解です 3月 01 22:53:49 PudeXp 「bof sp = bffffad8 セグメンテーション違反です」 と出ました。 3月 01 22:53:54 Defolos_ はい 3月 01 22:54:03 Defolos_ このSP=のあとの値 3月 01 22:54:22 Defolos_ これはbo-test.exeが実行された時のスタックポインタのアドレスです 3月 01 22:54:34 Defolos_ スタックポインタはスタックの一番上のアドレスのことです 3月 01 22:55:06 Defolos_ つまり、buffer配列の先頭とほぼ同じアドレスなのです 3月 01 22:55:27 Defolos_ ただし、SPの取得にはSP()という関数を使ってまして 3月 01 22:55:45 Defolos_ SP()も関数なので、スタックに幾らか情報を積みます 3月 01 22:55:57 Defolos_ その時のSPなので、実際は64バイトのずれがあります 3月 01 22:56:20 Defolos_ 次に、第一回の時につかった 3月 01 22:56:33 Defolos_ 挿入ベクター生成プログラムを見てください 3月 01 22:56:48 Defolos_ http://ruffnex.oc.to/defolos/exploiting/exploiting_practice/data/exploiting-01.html 3月 01 22:56:52 Defolos_ ここの下の方です 3月 01 22:57:14 Defolos_ これは、600バイトの領域を確保して 3月 01 22:57:42 Defolos_ はじめに戻りアドレスを上書きするアドレスで600バイト全体を生めます 3月 01 22:57:58 Defolos_ その後にNOPという特別なものを200バイト程書きます 3月 01 22:58:03 Defolos_ これは次回説明します 3月 01 22:58:14 Defolos_ 次に、シェルコードをその後ろに配置します 3月 01 22:58:35 Defolos_ この600バイトをbo-test.exeの引数としてbo-test.exeを呼び出します 3月 01 22:58:55 Defolos_ ここでは600バイトの文字列を使ってますが 3月 01 22:59:05 Defolos_ 実際のところbo-test.exe 3月 01 22:59:09 Defolos_ の戻りアドレスは 3月 01 22:59:39 Defolos_ buffer配列先頭の525バイト後ろから始まっています 3月 01 22:59:53 Defolos_ そこから4バイトが戻りアドレスで 3月 01 23:00:36 Defolos_ Strcpy関数は最後にNULLを書き込むので529バイトあれば十分戻りアドレスを上書きできます 3月 01 23:01:09 Defolos_ で、BUFFERの先頭はbo-test.exeがSPとして表示してくれているので 3月 01 23:01:29 Defolos_ BUFFER配列の先頭に制御を移すことができます 3月 01 23:01:38 Defolos_ これをやってみましょう 3月 01 23:02:01 Defolos_ /home/SAS_Workspaceに7_exploit.cというのがあるので 3月 01 23:02:04 Defolos_ コピーしてください 3月 01 23:02:21 Defolos_ で、VIとかEMACSとかで開いて 3月 01 23:02:26 Defolos_ 見てみてください 3月 01 23:02:47 Defolos_ シェルコードは第5回で作ったやつです 3月 01 23:03:43 Defolos_ で、malock()で529バイトの領域をヒープセグメントと言う特別な領域に確保しています 3月 01 23:04:13 Defolos_ この529バイトの先頭33バイトをシェルコードにします 3月 01 23:04:43 Defolos_ 残りは524から258バイト目までは何でもいいのですが 3月 01 23:05:03 Defolos_ とりあえずSPのアドレスと言うことにします 3月 01 23:05:19 Defolos_ で、今回のキーはretというやつですね 3月 01 23:05:37 Defolos_ ret = 0xbffff498というふうな記述があると思うのですが 3月 01 23:06:02 Defolos_ ここをbo-test.exeのBUFFER配列の先頭アドレスにすれば 3月 01 23:06:25 Defolos_ BUFFERの先頭に制御が移り、つまりシェルコードに制御がうつります 3月 01 23:06:31 Defolos_ よってシェルが起動する分けです 3月 01 23:06:48 Defolos_ bo-test.exeのbufferの先頭アドレスは 3月 01 23:06:58 Defolos_ 人によってそれぞれなので 3月 01 23:07:07 Defolos_ 各自調整してみましょう 3月 01 23:07:21 Defolos_ まず、bo-test.exeを起動してください 3月 01 23:07:47 Defolos_ bof sp = bffff668 セグメンテーション違反です と表示されます 3月 01 23:08:01 Defolos_ SPは先程言ったように64バイトずれてますので 3月 01 23:08:15 Defolos_ SPのアドレスに64を加算します 3月 01 23:08:47 Defolos_ そのようにして7_exploit.cを書き換えて 3月 01 23:08:57 Defolos_ EXPLOITを打ってみてください 3月 01 23:10:22 Defolos_ あ、ちょっと間違えました 3月 01 23:10:44 Defolos_ 7_exploit.cをコンパイルしたものを実行して 3月 01 23:11:30 Defolos_ et = bffff6af bof sp = bffff458 セグメンテーション違反です というような文字が 3月 01 23:11:34 Defolos_ 表示されると思います 3月 01 23:11:52 Defolos_ このときのbof sp =に注目するのでした 3月 01 23:12:07 Defolos_ ここの値に64を加算したものを 3月 01 23:12:20 Defolos_ 7_exploit.cのretに設定します 3月 01 23:13:30 Defolos_ 64は16進数で0x40なので、ご注意くださいね 3月 01 23:13:53 kotto うまくいきました 3月 01 23:14:23 Defolos_ シェル起動しましたか? 3月 01 23:14:54 kotto はい 3月 01 23:14:58 be-be- はい 3月 01 23:15:05 Defolos_ GOOD b 3月 01 23:16:09 * yuushi_q has quit (Ping timeout) 3月 01 23:16:55 h4ox 起動できました 3月 01 23:17:04 Defolos_ おめでとうございます! 3月 01 23:17:43 PudeXp 普通に起動したときに 3月 01 23:17:48 -PudeXp/#lykeion- bof sp = bffffae8 3月 01 23:17:48 -PudeXp/#lykeion- セグメンテーション違反です 3月 01 23:17:56 PudeXp と出た場合は 3月 01 23:18:16 -PudeXp/#lykeion- ret = 0xbffffb28; 3月 01 23:18:24 PudeXp と書き換えればいいのですよね? 3月 01 23:18:33 PudeXp うぅーん、、、できない・・・。 3月 01 23:18:36 Defolos_ はい。ただし 3月 01 23:18:56 Defolos_ 7_exploit.exeから起動した時ではないと 3月 01 23:19:07 Defolos_ スタックの構造が違ってしまうので 3月 01 23:19:18 Defolos_ うまく行かないのです 3月 01 23:20:40 Defolos_ あ 3月 01 23:20:46 Defolos_ PUDEさん 3月 01 23:21:04 Defolos_ execleの引数として指定しているプログラム名と 3月 01 23:21:09 Defolos_ 実際とが違うので 3月 01 23:21:16 Defolos_ うまく行かないのかも 3月 01 23:21:33 Defolos_ execleの引数名をちょっと変えれば行けそうです 3月 01 23:23:02 Defolos_ FCSAYさんはどうですか? 3月 01 23:23:12 FCSAY うまくいかないです 3月 01 23:23:33 Defolos_ どんな出力になります? 3月 01 23:23:34 PudeXp shが起動しました 3月 01 23:23:41 Defolos_ GOOD! 3月 01 23:24:13 -FCSAY/#lykeion- ret = bffffb18 3月 01 23:24:13 -FCSAY/#lykeion- bof sp = bffff8c8 3月 01 23:24:13 -FCSAY/#lykeion- セグメンテーション違反です 3月 01 23:24:28 FCSAY 何か勘違いしてますかねぇ 3月 01 23:24:31 Defolos_ あ、 3月 01 23:24:41 Defolos_ 64は16進数で40だから 3月 01 23:24:51 Defolos_ bffffb18+40で 3月 01 23:25:03 Defolos_ bffffb58かな 3月 01 23:25:38 Defolos_ ごめんなさい 3月 01 23:25:40 Defolos_ 間違えました 3月 01 23:25:58 FCSAY いや、元がbfffad8だったので 3月 01 23:26:58 Defolos_ bof sp = の値に 3月 01 23:27:03 Defolos_ 40を足せば良いのですが 3月 01 23:27:50 Defolos_ BFFFF908っぽいですね 3月 01 23:28:53 FCSAY を、うまくいきました 3月 01 23:28:59 Defolos_ おめでとうございます! 3月 01 23:29:05 Defolos_ えと、このように 3月 01 23:29:12 Defolos_ スタックポインタが分かれば 3月 01 23:29:25 Defolos_ バッファの先頭のアドレスを知ることができるので 3月 01 23:29:40 Defolos_ そのアドレスに戻りアドレスを上書きしてやることでペイロードを実行できました 3月 01 23:30:00 Defolos_ しかし、普通のプログラムはスタックポインタのアドレスなんか表示してくれません 3月 01 23:30:24 Defolos_ つまり、bufferの先頭を正確に知る手段が無いわけです 3月 01 23:30:43 Defolos_ その上に、今回はトライアンドエラーで無理矢理みつけましたが 3月 01 23:30:54 Defolos_ 戻りアドレスがどこに来るのかは予想できません 3月 01 23:31:22 Defolos_ システムによっては変数と変数の間にスペースをあけることもあるでしょうし 3月 01 23:31:42 Defolos_ かっちりと分かることは稀です 3月 01 23:31:53 Defolos_ ですので、今回のように 3月 01 23:32:00 Defolos_ 戻りアドレスを上書きするアドレスとして 3月 01 23:32:10 Defolos_ bffff432とかのアドレスを 3月 01 23:32:20 Defolos_ ハードコードするのは柔軟でなく、あまり意味をなしません 3月 01 23:32:34 Defolos_ よほどの下調べやテストができるなら別として 3月 01 23:33:11 Defolos_ 普通のプログラムをトライアンドエラーで攻略するには、あまりに難しいです 3月 01 23:33:26 Defolos_ そこで、次回はNOPスレッドを始めとして 3月 01 23:33:45 Defolos_ もっと柔軟に書けるようなテクニックを紹介します 3月 01 23:33:56 Defolos_ では、今日は以上ですが 3月 01 23:34:00 Defolos_ 何か質問はありませんか? 3月 01 23:34:24 h4ox すいません、よろしいですか? 3月 01 23:34:30 Defolos_ はい 3月 01 23:35:09 h4ox SPのオフセットとして使った64バイトというのは、どうやって見つけたのですか? 一バイトずつずらしながらの力技ですか? 3月 01 23:35:23 Defolos_ はい、力技です 3月 01 23:35:36 Defolos_ これはシステムによって変わって来るので 3月 01 23:35:39 h4ox なるほど… 3月 01 23:35:52 Defolos_ 計算などで求めるのは難しいです 3月 01 23:36:19 Defolos_ そこで、次回のトライアンドエラーをやらないで柔軟に書ける方法が生きて来る分けですね 3月 01 23:36:45 Defolos_ 他にはありませんか? 3月 01 23:36:53 h4ox ありがとうございます。 あと、次回の範囲になっちゃうのですが、もう一つよろしいですか? 3月 01 23:36:57 Defolos_ あ、はい 3月 01 23:37:54 h4ox 次回の、というか紹介されていた「Hacking:美しき策謀」に乗っている、NOPを利用したexploitコードはそのままのソースで使用は可能なのでしょうか…  3月 01 23:38:08 Defolos_ NOPを使うやつは 3月 01 23:38:18 Defolos_ 今回みたいにしち面倒臭い計算をしなくていいので 3月 01 23:38:23 Defolos_ そのまま使えますね 3月 01 23:38:40 Defolos_ そのためにNOPスレッドと言う柔軟なテクニックを用いるのですから 3月 01 23:39:04 h4ox なるほど。なんでかハマってしまっているのですが、次回までにできるだけ勉強してみます。ありがとうございました。 3月 01 23:39:19 Defolos_ 実は、第一回で紹介したやつはその本のコピーだったりします/// 3月 01 23:39:44 Defolos_ 他にはございませんか? 3月 01 23:40:18 Defolos_ 他にないようですので、今日はこれで終りますね 3月 01 23:40:23 Defolos_ お疲れ様でした。 3月 01 23:40:31 PudeXp ありがとうございました。 3月 01 23:40:31 h4ox どうもありがとうございました。次回もどうぞよろしくお願いいたします。 3月 01 23:40:36 FCSAY ありがとうございました 3月 01 23:40:41 be-be- ありがとうございました 3月 01 23:40:43 Defolos_ 本当に長い間かかってしまって申し訳ありませんでした>< 3月 01 23:40:54 kotto ありがとうございました 3月 01 23:41:43 * FCSAY (~fcsay@211.121.30.125.dy.iij4u.or.jp) has left #lykeion (Leaving...) 3月 01 23:42:00 Tcl interface unloaded 3月 01 23:42:00 Python interface unloaded **** Sat Mar 1 23:42:00 2008 でログ記録終了