• 検索結果がありません。

システムコール呼び出し回数を削減したegghunter

N/A
N/A
Protected

Academic year: 2021

シェア "システムコール呼び出し回数を削減したegghunter"

Copied!
6
0
0

読み込み中.... (全文を見る)

全文

(1)Vol.2014-DPS-158 No.18 Vol.2014-CSEC-64 No.18 2014/3/6. 情報処理学会研究報告 IPSJ SIG Technical Report. シ ス テム コ ール呼び出し 回数を 削減し た egghunter 山内 志織1,a). 齊藤 泰一1,b). 概要: egghuning と は、 メ モリ 脆弱性のあ る ア プリ ケ ーショ ン に 対する 攻撃手法の一つであ る 。 先行研究 と し て Skape の提案し た egghunter が存在する が、 そ こ では、 シス テム コ ール呼び出し 回数が多く 実行時 間が長く な る と いう 問題点が存在し た 。 そ こ で本稿では、 Skape の egghunter を 改良し シス テ ム コ ールの 呼び出し 回数を 削減し た 方式を 提案する 。. 1. はじ めに Staged shellcode と は、 メ モ リ 脆弱性( buffer overflow. GHz 2.2 egghunting の概要. 脆弱性、 integer overflow 脆弱性、 format string 脆弱性等). egghunting は、 仮想アド レ ス空間に格納さ れて いる shell-. を 持つア プリ ケ ーショ ン に 対する 攻撃に おいて 、 攻撃に 利. code 本体を egg と 呼ばれる 目印を 手がかり に 探し 出し 実. 用でき る バッ フ ァ のサイ ズが小さ いた め shellcode を 格納. 行する 技術である 。 ま ず、 egghunting で必要に な る 要素の. でき な いと き に 用いら れる 技術であ る 。. tag と egg に ついて 説明する 。. こ の Staged shellcode に分類さ れる 技術と し て egghunt-. ing と いう も のがある 。 egghunting では、 egghunter と 呼ば れる 小さ いサイ ズの shellcode を 使用する 。 ま ず、 egghunter はア プリ ケ ーショ ン のプロ セ ス のバッ フ ァ に 格納さ れ、 実. tag : 任意の 4byte。 shellcode 本体を 仮想ア ド レ ス 空間 から 探すと き の目印と な る 。. egg : tag を 2 つ 並べた 8byte。 shellcode 本体は egg の 直後に 格納さ れる 。. 行さ れる 。 そ の後、 ア プリ ケ ーショ ン のプロ セ ス の仮想ア. ま た 、 egghunter は以下の 3 つの条件を 満た さ な け ればな. ド レ ス 空間内で、 実際に 攻撃を 行う shellcode 本体を 探索. ら な い。. し 実行する 。. ( 1 ) 頑健性 (robustness) を 持つ. Skape [1] の Linux 版 egghunter では、 access シス テム. ( 2 ) サイ ズが小さ いこ と. コ ール、 sigacion システム コ ールを 用いる こ と によ り 、 安. ( 3 ) 処理が速いこ と. 全に 仮想ア ド レ ス 空間の探索を 行っ て いる 。 し かし 、 一般. egghunter が頑健 (robust) である ために は、 egghunter は、. に シス テム コ ールの呼び出し 回数が多いため実行時間が長. 不適切に 参照し た場合に 領域違反を 起こ し たり ア プリ ケ ー. く な っ て し ま う 、 と いう 問題点があっ た。 本稿では、 Skape. ショ ン を 破壊し たり し て し ま う 可能性がある 無効 (invalid). の egghunter を 改良し 、 シス テ ム コ ールの呼び出し 回数を. な メ モリ 領域に 、 安全に ア ク セ ス でき る 必要がある 。. 削減し た 方式を 提案する 。. 2. 準備 2.1 開発環境 本稿で提案する egghunter の開発は以下の環境で行っ た。. Kernel version : Linux 2.6.38. ま た、 egghunter は shellcode の一部である ので以下の条 件も 満たさ な け ればな ら な い。. • bad charecters(x00,x0a,x0d 等) を 含ま な いこ と x00 は文字列の終端を 表す NULL 文字で あ る 。 ま た 、 x0a と x0d は共に コ マ ン ド の最後を 表す文字である 。 • jmp 命令に は相対 jump を 使用する こ と. Architecture : i686. 絶対 jump では、 jump 先のアド レ スを 特定し jump し. Processor : Intel(R) Core(TM) i5-3570K CPU @ 3.40. な け ればな ら な い。 し かし 、 一般に 目的のア ド レ ス を 特定する のは難し い。 し た がっ て 、 jmp 命令に は相対. 1. a) b). 東京電機大学情報通信工学科 暗号方式・ 暗号プロ ト コ ル研究室 Tokyou Denki Uniersity [email protected] [email protected]. ⓒ 2014 Information Processing Society of Japan. jump を 使用する 。. 1.

(2) Vol.2014-DPS-158 No.18 Vol.2014-CSEC-64 No.18 2014/3/6. 情報処理学会研究報告 IPSJ SIG Technical Report. 2.3 提案方式構成のための仮定. ド レ ス に ついて シス テム コ ールを 呼び出し て 調査する 必要. 今回の提案方式は Skape の方式を 改良し て 処理速度を 向. がな い。 よ っ て 、 Skape の egghunter よ り も シス テ ム コ ー. 上さ せたも のである 。 提案方式の構成は以下の仮定と 実験. ルの呼び出し 回数が減る ので処理が速く な る こ と が期待さ. 結果に 基づく 。. れる 。. 仮定:ページの中に 1 つでも 有効な ア ド レ ス があれば、 そ のページの全ア ド レ ス は有効。. 2.4 仮定の検証. こ の仮定が成り 立て ば、 シス テム コ ール呼び出し 回数が削. こ こ では 2 つの事柄に ついて 検証する 。. 減でき 、 処理速度を 向上さ せる こ と ができ る 。 ま ず、 こ の. • シス テ ム コ ールに よ っ て EFAULT エラ ーが返さ れな い. 仮定の説明を する 為に ページと ア ド レ ス に ついて 述べる 。 ページは仮想ア ド レ ス 空間を 構成する も のである 。 通常 使用さ れる ページサイ ズは 32 ビッ ト シス テム では 4KB で. ア ド レ ス は、 読み込み可能な ア ド レ ス か。. • ページに 一つでも 有効な ア ド レ ス が存在する と き 、 同 一ページのそ の他のア ド レ ス も 有効である か。. あ り 、 本稿の実験環境で のペー ジ サイ ズ も 4KB で あ る 。. Skape の egghunter は、 ア ド レ ス の有効・ 無効を 検査す. ま た 、 ペー ジに は有効・ 無効と いう 概念があ る 。 [1] 有効. る 際、 access システム コ ールによ り EFAULT エラ ーが返さ. な ページと は対応する 物理メ モリ 、 ま たはス ワ ッ プ領域や. れる かど う かで有効・ 無効を 判定し て いる 。. ディ ス ク 上のフ ァ イ ルな ど の二次記憶装置上の領域が存在. access シ ス テ ム コ ールは、 本来はフ ァ イ ルに 対する 実. する ページである 。 無効な ページは対応する 物理メ モリ な. ユーザでのア ク セ ス 権を チ ェ ッ ク する た めのも のであ る 。. ど が存在せず、 未使用ま たはア ド レ ス 空間に 割り 当て ら れ. 引数に はフ ァ イ ルのア ク セ ス 権を チ ェ ッ ク する フ ラ グ を. て な いこ と を 表す。. セ ッ ト する こ と ができ 、 引数指定のア ク セ ス 権が無い場合. 次に ア ド レ ス の説明を する 。 仮定の文中で使われて いる. に EFAULT エラ ーを 返す。. ア ド レ ス は仮想ア ド レ ス を 意味し て いる 。 Skape はア ド レ. Skape の egghunter と 提案方式で は、 access シ ス テ ム. ス の有効・ 無効を 検査する 際、 シ ス テ ム コ ールを 用いる 。. コ ールを 本来の使用目的と は異な る 使い方を し て 、 ア ド レ. シス テム コ ールに は、 無効な メ モリ ア ド レ ス に 遭遇し たと. ス の有効・ 無効を 検査し て いる 。 Skape の egghunter では. き EFAULT エラ ーを 返却する も のがあ る 。 こ のこ と がア ド. access シ ス テ ム コ ールのフ ラ グを F OK に セ ッ ト し て い. レ ス が有効である かを 判別する 際に 役立つ。 EFAULT と は、. る 。 本来は、 F OK はフ ァ イ ルそ のも ののア ク セ ス 権に 関. POSIX.1 で定義さ れて いる エラ ーで ”bad address”を 意味. 係な く フ ァ イ ルが存在する かど う かのチェ ッ ク のみし か行. する 。. わな いた め 、 Skape の egghunter のア ド レ ス の検査で は、. Skape の egghunter では、アド レ スの検査のために access シ ス テ ム コ ール (あ る いは sigaction シ ス テ ム コ ール ) が. ア ド レ ス が存在する かど う かの判定し かし て いな いよ う に 見え る 。. 使用さ れて お り 、 検査対象のア ド レ ス に 対し 、 access シ. そこ で、 access システム コ ールでアド レ スの存在を 判定. ス テ ム コ ー ル (あ る い は sigaction シ ス テ ム コ ー ル ) が. し た後、 そ のア ド レ ス が読み込み可能かど う か判定する プ. EFAULT エラ ーを 返さ な い場合はそ のア ド レ ス を 有効な. ロ グラ ム を 用いて 実験を 行な っ た 。 こ の結果、 access シ. (valid) ア ド レ ス 、 EFAULT エラ ーを 返す場合はそ のア ド. ス テム コ ールで存在する と 判定さ れたア ド レ ス は必ず読み. レ スを 無効な (invalid) アド レ スと し て 定義し て いる よ う で. 込み可能である こ と が確認でき た。. ある 。 本稿でも こ の定義を 採用する 。 ま た、 こ の定義で有. ま た、 有効な ア ド レ ス に 遭遇し た場合、 そ のア ド レ ス か. 効と さ れたア ド レ ス は、 有効な ページ上の読み込み可能な. ら 1 ページ分のア ド レ ス が有効な ア ド レ ス である こ と が確. ア ド レ ス であ る こ と が、 次節の実験の中で確認さ れた。. 認でき た。 こ のこ と から 、 ページの先頭ア ド レ ス が有効な. Skape の egghunter は、 アド レ スを 一つずつシステムコ ー. ア ド レ ス の場合、 こ のページの全ア ド レ ス は有効な も ので. ルに よ っ て 検査し 、 ページ内で無効な ア ド レ ス に 遭遇し た. あ り 、 こ のページは有効な ページだ と いう こ と が言え る 。. 場合、 そ のア ド レ ス を 含む そ れ以降の同じ ペー ジ の全ア. し た がっ て 、 Linux Kernel 2.6.38 の i686 ア ーキ テ ク チ ャ. ド レ ス を 無効な ア ド レ ス と 判断し て 検査を 中止し 、 次の. 版の実装では、 こ の仮定に 妥当性がある と 言え る 。. ページのア ド レ ス の検査に 処理を 移す。 つま り 、 Skape の. egghunter では、 無効な ア ド レ ス が含ま れる ページに 含ま れる アド レ スは無効である と 仮定し て いる よ う である 。 本. 3. 関連研究 2004 年 Skape[1] に よ っ て 提案さ れた egghunter がある 。. 稿でも こ の仮定を 採用する 。 そ れに 加え 、 本稿ではページ の中に 一つでも 有効な ア ド レ ス があればそ のページの全ア ド レ ス は有効であ る と いう 上の仮定を 立て た 。 仮定が成り 立つ場合、 有効な ア ド レ ス に 1 つでも 遭遇す ればそ のページは有効と な り 、 そ のページのそ れ以降のア. ⓒ 2014 Information Processing Society of Japan. 3.1 概要 Skape の egghunter は以下のよ う な 構成を 持つ。 • 仮想ア ド レ ス 空間から ア ド レ ス を 取り 出し 以下の検査 を 行う 。. 2.

(3) Vol.2014-DPS-158 No.18 Vol.2014-CSEC-64 No.18 2014/3/6. 情報処理学会研究報告 IPSJ SIG Technical Report. – そ のア ド レ ス が有効であ る かど う かの検査 – そ のア ド レ ス から 始ま る 8 バイ ト に egg が格納さ れ て いる かど う かの検査. • いずれかの検査に 失敗し たと き 、 ア ド レ ス を 取り 直す 処理に 戻る 。. • 両方の検査に 成功し た と き 、 egg(あ る いは egg の直後 に 格納さ れて いる shellcode 本体) に 制御を 移す。 ま た、 仮想アド レ ス空間から アド レ スを 取り 出し アド レ スが 有効である か検査する ために、 Skape の Linux 版 egghunter では、 access システム コ ールと sigactioin システム コ ー ルを 使用し て いる 。. • access シス テ ム コ ール int access (const char *pathname, int mode);   システム コ ール番号は 0x21 である ので、 access シス テム コ ールを 呼び出す際は eax に シス テム コ ール番号 の 0x21、 ebx に 第一引数の pathname ポイ ン タ 、 ecx に 第二引数の mode の値を 格納する 。 検査対象のア ド レ ス は、 本来ア ク セ ス 権を チ ェ ッ ク する フ ァ イ ルの パス 名を 指す第一引数の pathname に 格納さ れる 。 本 稿の提案方式では、 こ の access シス テ ム コ ールを 用 いる 。. • sigaction シス テ ム コ ール int sigaction   (int signum, const struct sigaction *act, struct sigaction *oldact);   シ ス テ ム コ ール番号は 0x43 であ る ので、 sigaction シス テム コ ールを 呼び出す際は eax に シス テム コ ール 番号の 0x43、 ebx に 第一引数の signum の値、 ecx に 第二引数の act ポイ ン タ 、 edx に 第三引数の oldact ポイ ン タ を 格納する 。 検査対象のア ド レ ス は、 本来シ グナル動作を 設定する sigaction 構造体へのポイ ン タ 値が格納さ れる 第二引数の act に 格納さ れる 。 本稿の 提案方式で は sigaction シ ス テ ム コ ー ルを 使用し な いが、 付録と し て Skape の sigaction シ ス テ ム コ ー ル使用し た Linux 版 egghunter を 改良し たも のを 掲載 する 。. 3.2 access を 用いた egg hunter 解説 以下に Skape の egghunter を 記載する 。. 00000000 <_start>: 0: 31 d2. xor. edx,edx. 00000002 <pageinc>: 2: 66 81 ca ff 0f. or. dx,0xfff. 00000007 <addrinc>: 7: 42. inc. edx. ⓒ 2014 Information Processing Society of Japan. 8: 8d 5a 04 lea ebx,[edx+0x4] b: 6a 21 push 0x21 d: 58 pop eax e: cd 80 int 0x80 10: 3c f2 cmp al,0xf2 12: 74 ee je 2 <pageinc> 14: b8 90 50 90 50 mov eax,0x50905090 19: 89 d7 mov edi,edx 1b: af scasd 1c: 75 e9 jne 7 <addrinc> 1e: af scasd 1f: 75 e6 jne 7 <addrinc> 21: ff e7 jmp edi ま ず、 最初の 3 つの命令で edx の初期化と ページの先頭 ア ド レ ス の設定を 行っ て いる 。 lea 命令では、 access システム コ ールの第一引数への値 が ebx に 格納さ れる 。 ebx に はこ れから 検査する ア ド レ ス が格納さ れて いて 、 こ のア ド レ ス が access シス テ ム コ ー ルの返却値に よ っ て 有効か無効か判定さ れる 。 push、 pop 命令では、 access のシ ス テ ム コ ール番号を eax に格納し て いる 。 その後、 int 0x80 でソ フ ト ウ ェ ア割 り 込みを 行い access シ ス テ ム コ ー ルを 呼び出し て いる 。 EFAULT エラ ーが起こ っ た 場合の返却値は 0xffffff2f で あり 、 こ の返却値は eax に 格納さ れる 。 次の cmp 命令では、 返却値が EFAULT エラ ーが起こ っ た と き のも のかを 調べて いる 。 こ の cmp 命令では、 egghunter のサイ ズを 小さ く する た め、 返却値が EFAULT エラ ーの値 と 一致する かど う かの比較を eax の低位バイ ト al のみで 行っ て いる 。 比較の結果、 現在調べて いる ア ド レ ス が無効 な も のであっ たら 、 現在のページは無効な ページと 判断し 、 次のページの先頭アド レ スを 取得する 処理にジャ ン プする 。  次に 、 シス テム コ ールで検査し たア ド レ ス が有効な も のであっ たと き 、 egghunter はプロ セスの仮想アド レ ス空間 で shellcode 本体を 見つけ る た めに egg を 探す。 こ の例で は tag は 0x50905090 であ る 。 現在検査し て いる ア ド レ ス から 始ま る 8 バイ ト に egg が格納さ れて いる か調べる ため に、 eax に tag、 edi に現在検査し て いる アド レ スを 格納す る 。 scasd 命令は edi に 格納さ れて いる ア ド レ ス から の 4 バイ ト と eax の値を 比較する 。 こ れに よ っ て 、 eax に 格納 さ れた tag の値と edi に 格納さ れた現在検査し て いる ア ド レ ス を 比較でき る 。 ま た、 scasd 命令は比較の後 edi の値 を 4 イ ン ク リ メ ン ト する 。 し たがっ て 、 2 回目の scasd 命 令では、 1 回目に 比較し た edi に 格納さ れて いる ア ド レ ス を 4 イ ン ク リ メ ン ト し た 値と eax の値を 比較する 。 scasd 命令を 2 回行い、 edi に 格納さ れて いる ア ド レ ス から 8 バ イ ト と egg の値が一致し たと き egghunter は egg を 発見で き た こ と に な り 、 egg の直後に 格納さ れて いる shellcode 本体に 処理を 移す。 scasd 命令で egg を 発見でき な い場合 は、 次のページの先頭ア ド レ ス を 取得する 処理に ジャ ン プ する 。. 4. 提案方式 4.1 概要 本稿で 提案する 方式は、 Skape の egghunter を 改良し 、 処理速度を 速く し た も のであ る 。 Skape の egghunter と 異 な る 点は以下の 2 つである 。 • シス テム コ ールを 呼び出すタ イ ミ ン グはページの先頭 ア ド レ ス を 検査する と き のみ。. 3.

(4) Vol.2014-DPS-158 No.18 Vol.2014-CSEC-64 No.18 2014/3/6. 情報処理学会研究報告 IPSJ SIG Technical Report. • 有効な ページが複数連続し て 存在する 場合 (単独で存 在する 場合も 含む )、 有効な ページ群の先頭アド レ スと 末尾のア ド レ ス を 保存し 、 そ の有効な ページ群の中で 一気に egg の探査を 行う 。 提案する egghunter は以下のよ う な 構成を 持つ。 • 仮想ア ド レ ス 空間から ページの先頭ア ド レ ス を 取り 出 し 以下の処理を 行う 。 – ページの先頭ア ド レ ス が有効か無効かの検査 – 有効な ページ群の先頭ア ド レ ス と 末尾のア ド レ ス の 保存 • 有効な ページ群の中で、 検査対象のア ド レ ス から 始ま る 8 バイ ト が egg と 一致する か検査する 。 • 検査に 失敗し た場合は、 有効な ページ群の中で次のア ド レ ス を 取り 直す。 • 有効な ページ群の先頭ア ド レ ス ま で検査を 行な っ た場 合は、 次の有効な ページ群の先頭ア ド レ ス と 末尾のア ド レ ス を 取り 直す。 4.2 解説 今回提案する egghunter は以下のよ う に な っ て いる 。 00000000 <_start-0x2>: 0: 31 db. xor. ebx,ebx. 00000002 <_start>: 2: 31 f6. xor. esi,esi. 00000004 <pageinc>: 4: 66 81 cb ff 0f 9: 43. or inc. bx,0xfff ebx. 0000000a a: 31 c: 6a e: 58 f: cd 11: 3c 13: 74 15: 85 17: 75. 80 f2 08 f6 eb. xor push pop int cmp je test jne. ecx,ecx 0x21 eax 0x80 al,0xf2 1d <addrend> esi,esi 4 <pageinc>. 00000019 <addrstart>: 19: 89 de 1b: eb e7. mov jmp. esi,ebx 4 <pageinc>. 0000001d 1d: 85 1f: 74 21: 8d. <syscall>: c9 21. <addrend>: f6 e3 4b f8. 31: 75 f1 jne 24 <addrdec> 33: af scasd 34: 75 ee jne 24 <addrdec> 36: ff e7 jmp edi こ の egghunter は大ま かに 2 つのセ ク ショ ン に 分かれて いる 。 プ ロ グ ラ ム 先頭から addrend ラ ベル内の処理ま で では、 有効な ページ群 (単独で存在する 有効な ページも 含 む ) の先頭ア ド レ ス と 末尾のア ド レ ス の取得を し て お り 、 そ れ以降では取得し たア ド レ ス を 使っ て 有効な ページ群の 末尾のア ド レ ス から 先頭のア ド レ ス ま でに egg が無いか探 査する 。 ま ず、 ebx、 esi の初期化を 行う 。 そ し て pageinc ラ ベ ルではページの先頭ア ド レ ス を 取得する 処理を 行う 。 次に、 syscall ラ ベルでは、 access システム コ ールの呼 び出し を 行い、 ページの先頭ア ド レ ス が有効か無効の検査 を する 。 こ こ では ecx の初期化を 行な っ て いる 。 ecx の値 は access シス テ ム コ ールの第二引数に な る た め初期化し な く て はな ら な い。 次に シ ス テ ム コ ール呼び出し を 行う 。 こ の手順は Skape のも のと 同様である 。 シス テム コ ールか ら EFAULT エラ ーが返っ て き た と き 、 つま り 検査し て いる ア ド レ ス が無効であっ た場合、 こ のページが無効な ページ であ る と 判定し 、 addrend ラ ベルへジャ ン プする 。 一方、 検査し て いる ア ド レ ス が有効であっ た場合、 こ のページは 有効な ページと 判定する 。 こ こ で、 esi は有効な ページ群 の一番最初のア ド レ ス を 格納する も のと し て 利用する 。 そ し て 、 esi の値が 0、 つま り esi に 有効な ページ群の先頭 ア ド レ ス が格納さ れて いな いと き addrstart ラ ベルに 進 み、 esi の値が 0 でな い、 つま り esi に 有効な ページ群の 先頭アド レ スが格納さ れて いる と き pageinc ラ ベルにジャ ン プする 。 addrstart ラ ベルでは、 有効な ページ群の先頭ア ド レ ス を 取得を し て いる 。 こ のと き ebx は有効な ページの先頭ア ド レ ス を 格納し て いる ので、 こ の値を esi に コ ピ ーし て い る 。 そ の後 pageinc ラ ベルに ジャ ン プする 。 addrend ラ ベルでは、 有効な ページ群の末尾のア ド レ ス を 取得し て いる 。 ま ず、 esi の値を 調べ値が 0 であ っ た 場 合、 ま だ有効な ページに 出会っ て いな いと いう こ と な ので pageinc ラ ベルへジャ ン プする 。 seach ラ ベルでは、 scasd を 使用し て egg を 探す。 こ の 処理は Skape のも のと 同様であ る 。 こ の提案方式でも tag は 0x50905090 と し て いる 。. 5. 提案方式の評価 表 1. test je lea. esi,esi 4 <pageinc> ecx,[ebx-0x8]. 00000024 <addrdec>: 24: 49 25: 39 f1 27: 7c d9. dec cmp jl. ecx ecx,esi 2 <_start>. 00000029 <search>: 29: b8 90 50 90 50 2e: 89 cf 30: af. mov eax,0x50905090 mov edi,ecx scasd. ⓒ 2014 Information Processing Society of Japan. Skape の egghunter と 提案方式の比較 サイ ズ [byte]. 実行時間 [s]. call 数. Skape. 36  . 0.0590. 48409.7. 提案方式. 56. 0.0294. 36544.1. テ ス ト プロ グラ ム を 作成し 、 Skape の egghunter と 提案 方式の egghunter の比較を 行な っ た。 シス テム コ ール呼び 出し 回数、 実行時間の項目に ついて はそ れぞれのプロ グラ ム を 10 回実行し 、 その平均を と っ た値を 比較し て いる 。 ま た 、 shellcode 本体は実行さ れる と シス テ ム コ ールの exit を 呼び出すも のにし 、 heap 領域に格納し た。 システム コ ー ルの exit を 呼び出すも のに し た理由は、 exit がこ れを 呼 んだプロ セ ス を 直ち に 終了さ せる と いう も のであり 、 実行 時間の比較がし やすいから である 。 ま た、 テス ト プロ グラ. 4.

(5) Vol.2014-DPS-158 No.18 Vol.2014-CSEC-64 No.18 2014/3/6. 情報処理学会研究報告 IPSJ SIG Technical Report. ム 作成の際は gcc を 用いて 実行フ ァ イ ルを 作成し た 。 gcc のオプショ ン は以下のよ う に し た 。 $gcc -fno-stack-protector -z exestack -o egghunter egghunter.c. 5.1 頑健性 Skape の egghunter では、 acccess シス テ ム コ ールを 呼 び 出す前に ecx の初期化を し て いな い。 ecx に 格納さ れ て いる 値は access シス テ ム コ ールの第二引数に 渡さ れる 値な ので 、 初期化を 行わな いと ecx に お かし な 値が入っ て egghuunter が正常に 動作し な いこ と があ る こ と を 実験 で確認し た 。 し た がっ て 、 Skape の access シ ス テ ム コ ー ルを 用いた egghunter は少々 頑健性に 欠け て いる 。 ち な みに 、 Skape の egghunter に 初期化の処理を 追加する と 、 egghunter のサイ ズは 2 バイ ト 増え 、 38 バイ ト に な る 。 それに対し 、 提案方式では access システムコ ールを 呼び 出す前に ecx の初期化を 行っ て いる 。 し た がっ て 、 Skape の egghunter よ り も 頑健性があ る と 言え る 。 5.2 バイ ト 数 今回、 Skape 方式が 36byte なのに対し 、提案方式は 56byte に な っ た。 提案方式ではシス テム コ ール呼び出し 回数を 削 減する こ と に 重点を 置いたので Skape のも のよ り も 大き い サイ ズに な っ て し ま っ た 。. 6. おわり に 本稿で は 、 Skape の access シ ス テ ム コ ー ル を 用い た Linux 版 egghunter を 改良し 、 シス テ ム コ ール呼び出し 回 数を 削減し て 処理速度を 向上さ せた egghunter を 提案し た。 ま ず、 ページの中に 1 つでも 有効な ア ド レ ス があれば、 そ のページの全ア ド レ ス は有効と いう 仮定を 立て 、 こ の仮定 の妥当性を 実験を 行い検証し た。 そ の結果、 こ の仮定は妥 当な も のである こ と がわかっ たので、 こ の仮定に 基づき 提 案方式を 構成し た。 そ し て 、 実際に Skape の egghunter と 提案方式の egghunter を 比較し 、 シス テム コ ール呼び出し 回数を 削減する こ と で、 実行時間を 短く する こ と ができ る こ と を 示し た。 参考文献 [1] [2] [3]. Matt Miller(Skape) : Safely Searching Process Virtual Address Space(2004) Daniel P.Bovet,Marco Cesati : 詳解 Linux カ ーネ ル第3 版 (2007) Robert Love : Linux シス テム プロ グラ ミ ン グ (2008). 5.3 シ ス テム コ ール呼び出し 回数 システムコ ール呼び出し 回数の計測には Linux の strace コ マ ン ド を 使用し た 測 定 結 果 は Skape 方 式 が 48409.7[回]、 提 案 方 式 が 36544.1[回] と な り 、 提案方式の 方が シ ス テ ム コ ー ル 呼 び出し 回数が少な いこ と が確認でき た 。 5.4 実行時間 実行時間の計測には Linux の time コ マ ン ド を 使用し た。 測定結果は Skape 方式が 0.0590[s]、 提案方式が 0.0296[s] と な り 、 提案方式の方が速いこ と が確認でき た 。 こ のこ と から 、 シス テム コ ール呼び出し 回数が少な い方 が処理速度が速いと いう こ と が言え る 。 ま た、 現在はサイ ズの小さ いテ ス ト プロ グラ ム の中で egghunter を 動作さ せ て いる が、 よ り 大き いア プリ ケ ーショ ン の中では更に 速さ の差がつく と 考え ら れる 。 5.5 executable な egg か Skape の egg と 同様に 提案方式の egg も executable な egg であ る 必要はな い。 こ れは Skape の egghunter と 提案 方式の egghunter が仮想ア ド レ ス 空間から tag を 使用し て egg を 探査する 際に 、 scasd 命令を 使用し て いる から であ る 。 scasd 命令では eax と edi の比較を 行っ た後、 edi の 値が 4 バイ ト イ ン ク リ メ ン ト れさ る 。 そし て 、 scasd を 用い て 2 回比較を 行う と edi は 8 バイ ト イ ン ク リ メ ン ト さ れて shellcode 本体の先頭を 指す。 2 回の scasd 命令で仮想アド レ ス 空間から egg を 発見出来た 後、 egghunter は jmp edi 命令を 実行する が、 こ のと き edi は shellcode 本体の先頭 を 指し て いる ので実行を shellcode 本体に 移すこ と ができ る 。 し た がっ て 、 egg は executable であ る 必要はな い。. ⓒ 2014 Information Processing Society of Japan. 5.

(6) Vol.2014-DPS-158 No.18 Vol.2014-CSEC-64 No.18 2014/3/6. 情報処理学会研究報告 IPSJ SIG Technical Report. 21: 8d 59 f8. 付. 録. A.1 sigaction シ ス テ ム コ ー ルを 用い た 改良 版 egghunter こ こ では、 付録と し て Skape の sigaction システムコ ー ルを 用いた egghunter を 改良し た プ ロ グラ ム を 掲載する 。 こ のプロ グラ ム も 今回の提案方式と 同様に シス テム コ ール の呼び 出し 回数を 削減する こ と で 処理速度を 向上さ せて いる 。 し かし 、 Skape の sigaction シ ス テ ム コ ー ルを 用いた egghunter を 改良し た こ の方式は、 提案方式の access シ ス テ ム コ ールを 用いた egghunter よ り も 実行時間が長く な る 。 sigaction シス テム コ ールを 用いて 、 仮想ア ド レ ス 空 間から ページの先頭ア ド レ ス を 取り 出し て ア ド レ ス が有効 かど う か検査する 際、 こ のアド レ スは sigaction システム コ ールの第二引数に 渡さ れる 。 sigaction シス テム コ ール は、 第二引数に 渡さ れた ア ド レ ス から 16 バイ ト の検査を ま と めて 行う 。 し かし 、 今回の提案方式で、 シス テム コ ー ルを 用いたア ド レ ス 有効・ 無効の検査を する 必要がある ア ド レ ス はページの先頭ア ド レ ス だけ であり 、 sigaction シ ス テ ム コ ールを 用いて ページ内の 16 バイ ト も の検査を す る 必要は無い。 し た がっ て 、 実行時間も access シス テ ム コ ールを 用いた 方式の方が sigaction シ ス テ ム コ ールを 用いた 方式よ り も 速く な る 。 ま た、 sigaction シス テム コ ールを 用いた egghunter に は頑健性に お いて も 劣る 点があ る 。 そ れは、 sigaction シ ス テ ム コ ールが 0x00000000 から 0x00000fff ま での 1 ページを 検査でき な い点であ る 。 こ れは sigaction シ ス テ ム コ ール自体の仕様であ る ので egghunter の開発者側で 改善する こ と ができ な い。 00000000 <_start-0x2>: 0: 31 c9 xor ecx,ecx. 00000002 <_start>: 2: 31 f6. xor. esi,esi. 00000004 <pageinc>: 4: 66 81 c9 ff 0f 9: 41. or inc. cx,0xfff ecx. 0000000a <syscall>: a: 31 db c: 6a 43 e: 58 f: cd 80 11: 3c f2 13: 74 08 15: 85 f6 17: 75 eb. xor push pop int cmp je test jne. ebx,ebx 0x43 eax 0x80 al,0xf2 1d <addrend> esi,esi 4 <pageinc>. 00000019 <addrstart>: 19: 89 ce 1b: eb e7. mov jmp. esi,ecx 4 <pageinc>. 0000001d <addrend>: 1d: 85 f6 1f: 74 e3. test je. esi,esi 4 <pageinc>. ⓒ 2014 Information Processing Society of Japan. lea. ebx,[ecx-0x8]. 00000024 <addrdec>: 24: 4b 25: 39 f3 27: 7c d9. dec cmp jl. ebx ebx,esi 2 <_start>. 00000029 <search>: 29: b8 90 50 90 50 2e: 89 df 30: af 31: 75 f1 33: af 34: 75 ee 36: ff e7. mov mov scad jne scasd jne jmp. eax,0x50905090 edi,ebx 24 <addrdec> 24 <addrdec> edi. 6.

(7)

参照

関連したドキュメント

 本研究所は、いくつかの出版活動を行っている。「Publications of RIMS」

本節では本研究で実際にスレッドのトレースを行うた めに用いた Linux ftrace 及び ftrace を利用する Android Systrace について説明する.. 2.1

当社グループにおきましては、コロナ禍において取り組んでまいりましたコスト削減を継続するとともに、収益

限られた空間の中に日本人の自然観を凝縮したこの庭では、池を回遊する園路の随所で自然 の造形美に出会

(注)本報告書に掲載している数値は端数を四捨五入しているため、表中の数値の合計が表に示されている合計

子どもたちは、全5回のプログラムで学習したこと を思い出しながら、 「昔の人は霧ヶ峰に何をしにきてい

1.3で示した想定シナリオにおいて,格納容器ベントの実施は事象発生から 38 時間後 であるため,上記フェーズⅠ~フェーズⅣは以下の時間帯となる。 フェーズⅠ 事象発生後

(a) ケースは、特定の物品を収納するために特に製作しも