ret2libcとpopretで初等的BOF攻撃
東海道らぐ 2016-02-20
@monochrojazz
自己紹介のようなもの
● @monochrojazz(27)
● どこかの製造業でセキュリティっぽいことをやっ
ているとかいないとか
● 致命的な音ゲーマー
● CTF(pwnable)を解いてみたい、
が絶望的に初心者
コントローラをマイコン
と導電布で自作
アプリも自作(Android)
セキュリティ・・・。
● 「なぜ遠隔でPCを乗っ取ることができるのか」とい
う原理に興味を持った
● 仕事でセキュリティっぽいことをしていることもあり
CTFなどを勉強(役には立たない模様)
● 「セキュリティコンテストチャレンジブック」がその勉
強に割とよかった
● 今回はその内容を用いてUbuntuで
簡単なBOF攻撃を実践。
その内容を紹介。
個人的には良書
ltraceとstrace
● CTFにおいて遠隔でサーバの制御を奪う問題がpwnable
と呼ばれるジャンル。
● 多くの場合攻撃先サーバで実行されているバイナリが配
布される。
● 私の場合そのバイナリの種類をfileコマンドで特定してから
ltraceを実行する。
● ltraceで共有ライブラリの関数呼び出しをトレースする。
● 因みにstraceではシステムコールのトレースができる。
● ptraceというものもある。python東海で発表したので興味
があれば。
http://www.slideshare.net/monochrojazz/pythonptrace
ltraceとstrace
lsをltrace ライブラリ関数をトレース
-iオプションで実行中のアドレス
を表示
libcライブラリ関数の引数と返値
が表示される
ライブラリ関数を追うことでプログラムの動きが大雑把にわかる
BOF攻撃準備
● BOF脆弱性を持ったプログラムを自分で作る
● リモートで攻撃するのは面倒なのでrootでsetuid属
性を付与し、通常ユーザで実行してrootシェルを起
動することを目的とする
BOF攻撃準備
スタック防護だけは外してコンパイル
(スタック実行不能[NXbit]は継続)
gcc -m32 -fno-stack-protector bof.c -o
bof
再現性のためASLRも外す
echo 0 | sudo tee
/proc/sys/kernel/randomize_va_space
実験用プログラム
引数をstrcpyするだけ
参考用にアドレスをprintfなどしている
まずぶっ壊す
● 引数にAAAAAAA・・・・は当然の権利
● ltraceで経過を追跡
実行アドレスが「AAAA」になっている→
制御を任意のアドレスに飛ばせる
引数を用意してlibcのsystem関数
のアドレスに飛ばせば攻撃成功
そして飛ばす
● system関数のアドレスをgdb-pedaで特定
ここへとばす
で、シェルを起動
strcpy引数のコピ一先アドレスから
systemの引数(/bin/sh)の位置を計算
0x0804a025+28+12
system実行後
リターンアドレス
system関数
アドレス
奪うリターンアドレスの位置
はAAAABBBBCCCC・・・
と入力して計算
シェル起動成功
注)ltraceしているとrootにはならない
でも異常終了
popret
● 折角なのでシェル起動後exitを実行してクラッシュ
を回避してみる
● popretでさっき使った引数をpopしてから2つ目の
関数を実行する
● rp++というpopret gadgetを探すツールを利用
使う引数分popする
これが最終形
system実行後
popret
systemの引数:
popされてスタック
から消える
exitのアドレス
BBBB:exit実行後のリターンアドレス(不使用)
CCCC:exitの引数(不使用)
root奪取に成功、
クラッシュなし
systemのアドレス
ret2libcとpopretでlibc関数を複数実行可能
つまりsocket→connect→dup2→system
でバックドアを作ることも可能なはず
可能なら実演やります
意気揚々とCTFに挑戦
● 即死
● スタック防護を抜けられない
● そもそもlibcがリンクされていない
● CTF難しい(結論)
静的リンクもされてない
最近困っていること
● RaspberyPi(B+)から2へ移行したい
● upgradeしてカードを2へ差したが動かない
● (虹色の画面表示から音沙汰なし)
● カードそのままで初代では動く、RaspberryPi基板
を換えても動かない

ret2libcとpopretで初等的BOF攻撃