Exploiting実習 第0回
目次
講義編
- Exploiting実習の目的
- 進め方
- 成果物について
- 今後の予定
- 注意点
実習編
- SSHクライアントについて
- 接続テスト
- テキストエディタについて
- C言語について
- アセンブリについて
- ログアウト
Exploiting実習の目的
- Exploitの動作原理理解
- 実際にExploitを書くことで攻撃者側の視点を身につける
進め方
- 主読本:Jon Erickson: 『HACKING: 美しき策謀―脆弱性攻撃の理論と実際』の第1章
- オンラインによる実習形式
- IRCで解説を行いSSHサーバで実習を行う
- 解説、問題提示をはじめに行う
- SSHサーバに接続し問題を解く(主にプログラミング)
- どのようなコードを書けばよいかなどの議論はIRCで
- メモを各自作成し提出
成果物について
後の資料としてメモを活用したい。やったことの軌跡を残す。
- ソースコード、実行結果、必要と思うメモを記述
- 形式は電子化されて読めるものであればOK
- 書き方はどんなものでもかまいません
許諾をいただければ個々人のメモをネットに公開したいと思っています。
メモのサンプル
2007-05-19 Exploiting実習-第0回 Defolos
■helloの出力
プログラミングの基礎として画面にhelloと表示するプログラムの作成を行った。
●ソースコード
-----hello.c
#include <stdio.h>
int main(int argc, char *argv[]){
printf("Hello!\n");
return 0;
}
-----
・出力にはprintfをつかう。→printf("文字列")
・\nは改行を表す。
・プログラム正常終了として0を返す
●コンパイル
-----
Defolos@glazheim-w311hc ~
$ gcc -Wall hello.c
-----
・コンパイルにはgccを使う→gcc [オプション] ファイル名
・-Wallは詳細な警告を表示するオプション
●実行結果
-----
Defolos@glazheim-w311hc ~
$ ./a.exe
Hello!
-----
・実行するファイルの指定には./が必要
今後の予定
ハッキング基礎
- ハッキングの目的(権限について)
- ESPやEIPなどのレジスタの役割
シェルコーディング
- アセンブリの基礎
- シェルコードへの導入
- writeやreadシステムコールを用いたテスト用シェルコードの作成
- シェルコード作成のテクニック
- ローカルシェルコード
- アドバンスドシェルコード(ポリモフィック、エンコードシェルなど)
- リモートシェルコード
バッファオーバフロー
- スタックの構造とEIPの書き換え原理
- exploit作成に伴ういくつかのテクニック(NOPスレッド、環境変数へのシェルコードの格納など)
- ローカルバッファオーバフロー(いくつか脆弱性を抱えたプログラムを作成あるいは管理者が提示し、それに対してexploitを作成する)
- リモートバッファオーバフロー(いくつか脆弱性を抱えたプログラムを作成あるいは管理者が提示し、それに対してexploitを作成する)
フォーマットストリング攻撃
- フォーマットストリングとは
- アタックの動作原理
- フォーマットストリング攻撃による任意メモリの内容の読み出し
- フォーマットストリング攻撃による任意メモリへの書き込み
- dotrsへの攻撃
- GOTの上書き
できたらいいな
注意点
- 評定などの概念はない
- SSHサーバは実習時間中しか稼働していない
- 権限奪取後にトロイなどを仕込むのはご遠慮ください
SSHクライアントについて
- SSHクライアントにはPuTTY日本語版(http://hp.vector.co.jp/authors/VA024651/download/file/putty-0.60-jp20070430.zip)を利用する
- はじめに、上記のURLにアクセスしてダウンロードし、実行する
- 正常に起動するとこのプログラムは次のようなウィンドウを表示する
- 日本語を表示するために[ウィンドウ]->[変換]の「受信されるデータの文字セット変換」がEUC-JPになっていることを確認する
- 次にフォントの変更を行う[ウィンドウ]->[外観]の「フォントの設定」の変更ボタンを押し、「MS ゴシック」を選択する
- 接続を行うために「ホスト名(またはIPアドレス)」フィールドにSSHサーバのIPアドレスを入力し「プロトコル」ラジオボタンを「SSH」に設定する
- この設定情報を記録するために「保存されたセッション」フィールドに適当な名前を入力し「保存」ボタンを押す
- 「開く」ボタンを押して接続する
接続テスト
- 正常に接続が完了すると黒いコマンドラインの画面になるので、ユーザ名とパスワードを入力してログインする
- ユーザ名とパスワードは直前に配布
- パスワードの入力部分はショルダーハック防止のためエコーバックされない
- ログインしたら、まずパスワードを変更する
$ passwd
New password:
Re-enter new password:
Password changed.
テキストエディタについて
- お好みのエディタを使ってください
- 作業はログインIDと同じディレクトリまたはSAS_Workspace(共有スペース)で行う
- ここでは例としてviの使い方を解説する
viの基礎
- viにはコマンドモードと編集モードの2つが存在する
- コマンドモードはカーソルの移動やコピーペーストなどの作業を行うためのモードである
- 編集モードは文字の挿入を行うためのモードである
- [Esc]キーを押すと必ずコマンドモードに移行する
- カーソルの←↓↑→はhjklキーで行う
- 編集モードに移行するには挿入したい位置でiを押す
- 文字の削除はx
- アンドゥはu
- 保存して閉じる場合は:wq
- 保存しないで閉じる場合は:q!
C言語について
- exploitの記述に使用する
- ソースコードは「hello.c」のようにする
Cコードのコンパイル
defolos@glazheim:~$ gcc -Wall -o hello.exe hello.c
- コンパイラにはgccを使用
- -Wallは詳細な警告を表示するオプション
- -oは実行可能ファイルに名前をつけるオプション
例題 0.1
与えられた2つの整数の最大公約数を求めるプログラムをC言語で作成せよ。テストデータとして与えるデータを次に記述する。
1234, 987
432, 4
57, 11
アセンブリについて
- GASを利用する
- GNUが開発したアセンブリ言語、gccでコンパイル可能
GAS
- エントリポイント:そこからプログラムが始まることを明示する
.global main
main:
- ディレクティブ:アセンブラにどのような解釈を行わせるか指定する
.code32
.text
.data
- eaxレジスタに4という数値を格納
movl $4, %eax
- レジスタは%をつけ、値には$をつける
- データの宣言の仕方
msg: .ascii "hello"
- ファイル名は「hello.s」のようにする
GASコードのコンパイル
defolos@glazheim:~$ gcc hello.s
例題 0.2
標準出力に「Hello!」と表示するプログラムをアセンブリで記述しなさい。
ログアウト
- ログアウトする時はexitコマンドを使う
- できるだけ強制終了はしない
Copyleft (C) 2007. Defolos. All rights opened.