Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ファジングツールAFLが ターゲットに入力を送る方法 公開版v2

msymt
August 08, 2022

ファジングツールAFLが ターゲットに入力を送る方法 公開版v2

セキュリティ・キャンプ全国大会2022 オンライン LT大会 公開版
#seccamp #AFL #Fuzzing #ファジング

GitHub
https://github.com/msymt/afl-fuzz-to-target

msymt

August 08, 2022
Tweet

More Decks by msymt

Other Decks in Education

Transcript

  1. ファイルディスクリプタ(file descriptor, fd) 5 • システムコールopen(2)の使用時、 そのファイルを示す非負整数のfdを返す • 予約番号 ◦

    0: 標準入力 ◦ 1: 標準出力 ◦ 2: 標準エラー出力 • ファイルへの読み書きや位置決めは、fdを使用 プロセス fd:1(標準出力) fd:2(標準エラー出力) fd:0(標準入力) プロセス fd:3 ファイルA int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); 例:ファイルAを読みモードで開いた
  2. ワークフロー 1. afl-fuzzを起動 2. afl-fuzz:用意したファズ(入力値)を.cur_inputに書き込む 3. afl-fuzz:子プロセスを生成 4. afl-fuzz(子プロセス):ターゲットプログラム(target)を起動 a.

    target:標準入力から文字列を受取 b. target:受け取った文字列をファイルに書き込み、終了 5. afl-fuzz: 子プロセスの終了を待機 7
  3. 子プロセス afl-fuzz(親プロセス) target .cur_inputにファズを 書き込む .cur_inputの 読み書き位置を 先頭に戻す 子プロセスを生成 子プロセスの終了を待機

    標準入力のfd(0)を .cur_inputのfdで上書き 標準入力の受取・コー ド実行 targetの起動 終了 lseek dup2 execv .cur_inputを開く ワークフロー fd = open(O_RDWR) 8
  4. 子プロセス afl-fuzz(親プロセス) target .cur_inputにファズを 書き込む .cur_inputの 読み書き位置を 先頭に戻す 子プロセスを生成 子プロセスの終了を待機

    標準入力のfd(0)を .cur_inputのfdで上書き 標準入力の受取・コー ド実行 targetの起動 終了 lseek dup2 execv .cur_inputを開く ワークフロー fd = open(O_RDWR) 9
  5. 子プロセス afl-fuzz(親プロセス) target .cur_inputにファズを 書き込む .cur_inputの 読み書き位置を 先頭に戻す 子プロセスを生成 子プロセスの終了を待機

    標準入力のfd(0)を .cur_inputのfdで上書き 標準入力の受取・コー ド実行 targetの起動 終了 lseek dup2 execv .cur_inputを開く ワークフロー fd = open(O_RDWR) 10 execv後も有効
  6. 子プロセス afl-fuzz(親プロセス) target .cur_inputにファズを 書き込む .cur_inputの 読み書き位置を 先頭に戻す 子プロセスを生成 子プロセスの終了を待機

    標準入力のfd(0)を .cur_inputのfdで上書き 標準入力の受取・コー ド実行 targetの起動 終了 lseek dup2 execv .cur_inputを開く ワークフロー fd = open(O_RDWR) 11 .cur_inputを 読み込む
  7. 子プロセス afl-fuzz(親プロセス) target .cur_inputにファズを 書き込む .cur_inputの 読み書き位置を 先頭に戻す 子プロセスを生成 子プロセスの終了を待機

    標準入力のfd(0)を .cur_inputのfdで上書き 標準入力の受取・コー ド実行 targetの起動 終了 lseek dup2 execv .cur_inputを開く ワークフロー(プログラム) fd = open(O_RDWR) 12
  8. 子プロセス afl-fuzz(親プロセス) target .cur_inputにファズを 書き込む .cur_inputの 読み書き位置を 先頭に戻す 子プロセスを生成 子プロセスの終了を待機

    標準入力のfd(0)を .cur_inputのfdで上書き 標準入力の受取・コー ド実行 targetの起動 終了 lseek dup2 execv .cur_inputを開く ワークフロー(プログラム) fd = open(O_RDWR) 13
  9. afl-fuzz ワークフロー(図版) out_fd 15 forkによりfdは継承 .cur_input 子プロセス (target) out_fd 子プロセス

    (target) out_fd int dup2(int oldfd, int newfd); ファイルディスクリプタ oldfd を newfd でも使えるようにする
  10. afl-fuzz ワークフロー(図版) out_fd 16 dup2(out_fd, 0); .cur_input 子プロセス (target) out_fd

    子プロセス (target) fd:0(標準入力) out_fd target.c int dup2(int oldfd, int newfd); ファイルディスクリプタ oldfd を newfd でも使えるようにする
  11. afl-fuzz ワークフロー(図版) out_fd 17 .cur_input 子プロセス (target) out_fd 子プロセス (target)

    fd:0(標準入力) out_fd target.c int dup2(int oldfd, int newfd); ファイルディスクリプタ oldfd を newfd でも使えるようにする “Hello, World!” をファズとする
  12. afl-fuzz ワークフロー(図版) out_fd 18 .cur_input 子プロセス (target) out_fd 子プロセス (target)

    fd:0(標準入力) out_fd target.c int dup2(int oldfd, int newfd); ファイルディスクリプタ oldfd を newfd でも使えるようにする “Hello, World!” をファズとする out.txtに “Hello, World!” が渡る
  13. 参考文献 21 • ipa, ファジング活用の手引き, https://www.ipa.go.jp/files/000057652.pdfZ • 冨永 和人, 権藤

    克彦, 例解UNIX/Linuxプログラミング教室: システムコールを使 いこなすための12講 • 田浦健次朗, ファイルディスクリプタと擬似ファイル 副題: Unix的な考え方(全てが ファイル), https://www.eidos.ic.i.u-tokyo.ac.jp/~tau/lecture/operating_systems/slides/pdf/ 07_everything_is_file.pdf