SlideShare a Scribd company logo
Use After Free脆弱性攻撃を試す
東海道らぐ@豊橋 2016-04-23
@monochrojazz
自己紹介のようなもの
● @monochrojazz(27)
● セキュリティに興味 が、初心者
● 致命的な音ゲーマー
音ゲーコントローラを
自作
アプリも自作(Android)
前回
BOF攻撃でroot奪取
BOF実験で攻撃の考え方を習得
(した気でいた)
しかし
BOF
UseAfterFree
脆弱性攻撃タイプの変遷
2006 2013
BOF 5%以下
http://www.atmarkit.co.jp/ait/articles/1409/22/news010.html
(; ^ω^)
BOF
UseAfterFree
脆弱性攻撃タイプの変遷
2006 2013
代わりにUseAfterFree 50%
http://www.atmarkit.co.jp/ait/articles/1409/22/news010.html
Use After Freeって?
・・・
・・・
0x084b018
・・・
・・・
1
ヒープに領域確保
ポインタ型保存
2
・・・
・・・
0x084b018
・・・
・・・
領域解放
3
・・・
・・・
0x084b018
・・・
・・・
新たに領域確保
4
・・・
・・・
0x41414141
・・・
・・・
領域に任意アドレス
の書込
char *a
5
・・・
・・・
0x41414141
・・・
・・・
ポインタ型を呼出
任意アドレスへ
read/write
char *a
新規領域位置は
一意
strcpy(a, argv[1])があれば
任意アドレス書込など
Q.そんな都合のいい脆弱性ある?
A. ブラウザなど
Javascript
攻撃コードサンプル
Javascriptは領域確保解放が
ユーザ側で自由に可能
ブラウザ脆弱性を利用し
悪性コードを動かせば
制御を奪える
もちろんブラウザ側もsandboxなどで
いろいろ対策を講じています
今回の目的
UseAfterFreeで任意アドレス書込
printfをsystemに書き換え
シェル起動
参考ていうかコピペ:
use-after-freeによるGOT overwriteをやってみる
http://inaz2.hatenablog.com/entry/2014/06/18/215452
今回のプログラム
領域確保
領域解放
新規領域確保
新規領域書込
UseAfterFree
書き換えターゲット
argv[2] 領域位置調整用
argv[3] 書きこみたいアドレス
argv[4] 書き込む内容
DEP,SSP有効でコンパイル(デフォルト)
ASLR無効環境で実行
まずぶっ壊す
新規領域書込
UseAfterFree
解放済のポインタを呼出
0x42424242(=”BBBB”)アドレスに”EEEE���を書込
BBBBとEEEEを変えれば任意アドレスへの任意入力可能
注)新規領域サイズ次第で     
解放済領域の上書きは不可に
BBBBより後
GOT Overwrite
printf → systemに書き換え
GOT Overwriteの利用
printfのGOT領域
このアドレスの先(printfの実体)の書き換え
printf 実行時に書き換えたアドレスに飛ぶ
= systemのアドレスに飛ばせる
systemのアドレスはgdb-pedaや
nm -D /lib/i386-linux-gnu/libc.so.6 | grep " system"
などで調査
シェル起動
printfのGOT領域 system関数アドレス
argv[3] 書きこみたいアドレス = printf GOT領域
argv[4] 書き込む内容 = systemアドレス
シェル起動成功
制御奪えてないけど?
UseAfterFreeは任意アドレス読み書きの手段
制御奪取は追加でStack Pivot
任意アドレスが読めればASLR回避も可能
(アドレスリーク)
スタックポインタを
ヒープ領域(任意入力可)へ
→何でもできる
ランダムなlibcベースアドレスを読取
その値から計算したアドレスに飛ばす

More Related Content

Use After Free 脆弱性攻撃を試す