exploit libpng_arm
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[FrontPage]] > [[Armadillo-9]] > [[exploit libpng_arm]]
*libpng(ARM) [#wcf67f24]
ARM版の攻撃方法
**環境 [#w30b14bb]
-CPU: ARM9
-OS: Debian Sarge(2.4.31-a9-2)
--アットマークテクノのページで配布されているものを使った
-target: imagemagick-6.0.4(Debian Sarge 版)
-target: libpng-1.2.5(オリジナル版)を少し改造する。
--コンパイラに渡すオプション -O3 を外す。
--imagemagick 側の対策を回避するために Warning のメッセー...
-imagemagick に脆弱性のある libpng を LD_PRELOAD で差し込...
--LD_PRELOAD で複数のライブラリを指定するときはスペース区...
**攻撃対象 [#u9553e91]
-バッファオーバーフロー脆弱性のある箇所は x86 版と同じで...
-x86
--リターンアドレスを書き換えて、攻撃コードにリターンさせ...
--ARM版の攻撃も可能だと思われる(未確認)
-ARM
--リターンアドレスを書き換える方法は使えない。
--libpng が用いる構造体を偽者のデータとすり替えて、攻撃コ...
***リターンアドレス書き換えが使えない理由 [#rc7ef7c3]
-まず両者ではスタックの積み方が異なる。
--x86: [readbuf] [...] [ret_addr] [arg2, 1, 0 逆かも?]
--ARM: [readbuf] [arg2] [arg1] [arg0] [20bytes] [ret_addr]
-readbuf: オーバーフローが起こるバッファ
-arg_n: n 番目の引数
--arg0: png_ptr
--arg1: info_ptr
--arg2: length
-ret_addr: リターンアドレス
バッファオーバーフローを起こす部分は次のコードの [!] の行...
その後、png_ptr(arg0) を利用しているため、下手にpng_ptr ...
png_crc_read(png_ptr, readbuf, (png_size_t)length); //[!]
png_ptr->num_trans = (png_uint_16)length;
-x86 は、引数がリターンアドレスの後ろに居るので、リターン...
--ARM: [readbuf](overflow!!)[(x)...] [ret_addr -> addr_at...
-ARM は、引数がリターンアドレスより前に居るため、リターン...
--ARM: [readbuf](overflow!!)[(x)arg2] [(x)arg1] &color(or...
**ARMでの攻撃手法 [#nb69cd99]
-png_crc_read でバッファオーバーフローを起こした後、以下...
--png_crc_finish(pngrutil.c 94行目から。pngrutil.c lines ...
--png_crc_error(pngrutil.c 130行目から)
--png_read_data(pngrio.c 27行目から)
-png_read_data では第一引数の png_ptr 内の関数ポインタを...
void /* PRIVATE */
png_read_data(png_structp png_ptr, png_bytep data, png_s...
{
png_debug1(4,"reading %d bytes\n", (int)length);
if (png_ptr->read_data_fn != NULL)
(*(png_ptr->read_data_fn))(png_ptr, data, length);...
else
png_error(png_ptr, "Call to NULL read function");
}
-png_ptr のデータをすりかえて、関数ポインタに攻撃コードを...
**攻撃の詳細 [#u75e173a]
-リターンアドレスは使わない。
-書き換えるのは png_ptr(arg0) である。
--関数ポインタが攻撃コードのアドレスを指すようにするため...
--png_ptr(0x00112233) -> 0x00112233 [本来のデータ領域]~
これを書き換えて~
png_ptr(0xdeadbeaf) -> 0xdeadbeaf [攻撃コードの開始アドレ...
とする。これによって関数ポインタが攻撃コードの開始アドレ...
***計算すべきアドレス [#u250516e]
-必要なもの
--readbuf(オーバーフローさせるバッファ)の開始地点
-計算するもの
--攻撃コードの開始地点
--png_ptr が指す領域(攻撃コードの開始アドレスで埋め尽く...
***攻撃作成の際の注意点 [#p12bcfb5]
-スタックの開始位置が多少ずれても平気なように、png_struct...
-同様に攻撃データの開始地点も余裕を持って、nop(ARM だと m...
*攻撃データの詳細 [#p38f9fed]
**データの配置イメージ [#rc658d64]
0x021: [tRNS チャンクのサイズ(注:ビッグエンディアンで...
0x025: [tRNS]
0x029: [ゴミデータ]
0x131: [arg0 の書き換え用データ: ptr_fraud_png]
0x149: [リターンアドレス(今回は使わない)]
0x14d: [攻撃コードの先頭アドレス ptr_attack で埋め尽くし...
0x3c1: [同上] <- ptr_fraud_png の指す位置
[同上]
0x671: [nop で埋め尽くしている領域]
0x875: [同上] <- ptr_attack の指す位置
[同上]
0xab5: [mov r5, pc]
0xab9: [sub r5, r5, #8]
0xabd: [攻撃コード]
0xb11: [swi 0x0090000b]
0xb19: [攻撃用データ]
-スタックの開始位置がずれても割と平気な攻撃コードになって...
-x86 のときはかなりシビアにアドレスを指定しなければならな...
**攻撃用データの配置イメージ [#ibb69526]
offset
+0 ["/bin"]["//sh"][NULL]
+12 ["-ppi"][NULL]
+20 ["touc"]["h${I"]["FS}/"]["tmp/"]["itwo"]["rked"][N...
+48 [argv[0]][argv[1]][argv[2]][argv[3]]
+64 [env]
-アクセス方法は、[r5 + 100(攻撃コードのサイズ) + offset] ...
--r5 自体は mov r5, pc の命令があるアドレスを指している。
**実際に使用した値 [#hb615224]
-攻撃データ全体のサイズ: 2888バイト
--これは tRNS チャンクのサイズに指定する。
-ベースとなるアドレス(readbuf の開始地点)はいくつかの場合...
--/tmp/ で実行すると、0xbfffa4a0
--/home/username/ で実行すると、0xbfff490
--/home/username/apps/libpng_exploit/ で実行すると、0xbff...
-攻撃コードの先頭アドレスで埋めた領域、の真ん中あたりを指...
--base+920 バイトを使った
-nop〜攻撃コード〜攻撃用データ、の先頭部分 nop の領域を指...
--base+2124 バイトを使った
終了行:
[[FrontPage]] > [[Armadillo-9]] > [[exploit libpng_arm]]
*libpng(ARM) [#wcf67f24]
ARM版の攻撃方法
**環境 [#w30b14bb]
-CPU: ARM9
-OS: Debian Sarge(2.4.31-a9-2)
--アットマークテクノのページで配布されているものを使った
-target: imagemagick-6.0.4(Debian Sarge 版)
-target: libpng-1.2.5(オリジナル版)を少し改造する。
--コンパイラに渡すオプション -O3 を外す。
--imagemagick 側の対策を回避するために Warning のメッセー...
-imagemagick に脆弱性のある libpng を LD_PRELOAD で差し込...
--LD_PRELOAD で複数のライブラリを指定するときはスペース区...
**攻撃対象 [#u9553e91]
-バッファオーバーフロー脆弱性のある箇所は x86 版と同じで...
-x86
--リターンアドレスを書き換えて、攻撃コードにリターンさせ...
--ARM版の攻撃も可能だと思われる(未確認)
-ARM
--リターンアドレスを書き換える方法は使えない。
--libpng が用いる構造体を偽者のデータとすり替えて、攻撃コ...
***リターンアドレス書き換えが使えない理由 [#rc7ef7c3]
-まず両者ではスタックの積み方が異なる。
--x86: [readbuf] [...] [ret_addr] [arg2, 1, 0 逆かも?]
--ARM: [readbuf] [arg2] [arg1] [arg0] [20bytes] [ret_addr]
-readbuf: オーバーフローが起こるバッファ
-arg_n: n 番目の引数
--arg0: png_ptr
--arg1: info_ptr
--arg2: length
-ret_addr: リターンアドレス
バッファオーバーフローを起こす部分は次のコードの [!] の行...
その後、png_ptr(arg0) を利用しているため、下手にpng_ptr ...
png_crc_read(png_ptr, readbuf, (png_size_t)length); //[!]
png_ptr->num_trans = (png_uint_16)length;
-x86 は、引数がリターンアドレスの後ろに居るので、リターン...
--ARM: [readbuf](overflow!!)[(x)...] [ret_addr -> addr_at...
-ARM は、引数がリターンアドレスより前に居るため、リターン...
--ARM: [readbuf](overflow!!)[(x)arg2] [(x)arg1] &color(or...
**ARMでの攻撃手法 [#nb69cd99]
-png_crc_read でバッファオーバーフローを起こした後、以下...
--png_crc_finish(pngrutil.c 94行目から。pngrutil.c lines ...
--png_crc_error(pngrutil.c 130行目から)
--png_read_data(pngrio.c 27行目から)
-png_read_data では第一引数の png_ptr 内の関数ポインタを...
void /* PRIVATE */
png_read_data(png_structp png_ptr, png_bytep data, png_s...
{
png_debug1(4,"reading %d bytes\n", (int)length);
if (png_ptr->read_data_fn != NULL)
(*(png_ptr->read_data_fn))(png_ptr, data, length);...
else
png_error(png_ptr, "Call to NULL read function");
}
-png_ptr のデータをすりかえて、関数ポインタに攻撃コードを...
**攻撃の詳細 [#u75e173a]
-リターンアドレスは使わない。
-書き換えるのは png_ptr(arg0) である。
--関数ポインタが攻撃コードのアドレスを指すようにするため...
--png_ptr(0x00112233) -> 0x00112233 [本来のデータ領域]~
これを書き換えて~
png_ptr(0xdeadbeaf) -> 0xdeadbeaf [攻撃コードの開始アドレ...
とする。これによって関数ポインタが攻撃コードの開始アドレ...
***計算すべきアドレス [#u250516e]
-必要なもの
--readbuf(オーバーフローさせるバッファ)の開始地点
-計算するもの
--攻撃コードの開始地点
--png_ptr が指す領域(攻撃コードの開始アドレスで埋め尽く...
***攻撃作成の際の注意点 [#p12bcfb5]
-スタックの開始位置が多少ずれても平気なように、png_struct...
-同様に攻撃データの開始地点も余裕を持って、nop(ARM だと m...
*攻撃データの詳細 [#p38f9fed]
**データの配置イメージ [#rc658d64]
0x021: [tRNS チャンクのサイズ(注:ビッグエンディアンで...
0x025: [tRNS]
0x029: [ゴミデータ]
0x131: [arg0 の書き換え用データ: ptr_fraud_png]
0x149: [リターンアドレス(今回は使わない)]
0x14d: [攻撃コードの先頭アドレス ptr_attack で埋め尽くし...
0x3c1: [同上] <- ptr_fraud_png の指す位置
[同上]
0x671: [nop で埋め尽くしている領域]
0x875: [同上] <- ptr_attack の指す位置
[同上]
0xab5: [mov r5, pc]
0xab9: [sub r5, r5, #8]
0xabd: [攻撃コード]
0xb11: [swi 0x0090000b]
0xb19: [攻撃用データ]
-スタックの開始位置がずれても割と平気な攻撃コードになって...
-x86 のときはかなりシビアにアドレスを指定しなければならな...
**攻撃用データの配置イメージ [#ibb69526]
offset
+0 ["/bin"]["//sh"][NULL]
+12 ["-ppi"][NULL]
+20 ["touc"]["h${I"]["FS}/"]["tmp/"]["itwo"]["rked"][N...
+48 [argv[0]][argv[1]][argv[2]][argv[3]]
+64 [env]
-アクセス方法は、[r5 + 100(攻撃コードのサイズ) + offset] ...
--r5 自体は mov r5, pc の命令があるアドレスを指している。
**実際に使用した値 [#hb615224]
-攻撃データ全体のサイズ: 2888バイト
--これは tRNS チャンクのサイズに指定する。
-ベースとなるアドレス(readbuf の開始地点)はいくつかの場合...
--/tmp/ で実行すると、0xbfffa4a0
--/home/username/ で実行すると、0xbfff490
--/home/username/apps/libpng_exploit/ で実行すると、0xbff...
-攻撃コードの先頭アドレスで埋めた領域、の真ん中あたりを指...
--base+920 バイトを使った
-nop〜攻撃コード〜攻撃用データ、の先頭部分 nop の領域を指...
--base+2124 バイトを使った
ページ名: