AFL fork server和fuzzer的交互

看了一些博客,都是在說fuzzer和fork server進行交互,由fork server fork出子進程來執行程序,但是不太明白這兩者到底是如何在代碼層面進行交互的。

run_target中有這么一段代碼,大概意思是fuzzer給fork server傳遞prev_timed_out,然后再從fork server讀取子進程的pid,child_pid:

    s32 res;/* In non-dumb mode, we have the fork server up and running, so simplytell it to have at it, and then read back PID. */if ((res = write(fsrv_ctl_fd, &prev_timed_out, 4)) != 4) {if (stop_soon) return 0;RPFATAL(res, "Unable to request new process from fork server (OOM?)");}if ((res = read(fsrv_st_fd, &child_pid, 4)) != 4) {if (stop_soon) return 0;RPFATAL(res, "Unable to request new process from fork server (OOM?)");}if (child_pid <= 0) FATAL("Fork server is misbehaving (OOM?)");

我現在的問題是,為什么fuzzer給fork server傳了個參數,fork server就直接返回pid了呢?這中間兩者是如何進行交互的?fork server做了什么,就傳遞了一個child_pid出來?

fork server進程是執行了下面這段代碼(刪去了一些不重要的代碼):

  if (!forksrv_pid) {struct rlimit r;/* Isolate the process and configure standard descriptors. If out_file isspecified, stdin is /dev/null; otherwise, out_fd is cloned instead. */setsid();dup2(dev_null_fd, 1);dup2(dev_null_fd, 2);if (out_file) {dup2(dev_null_fd, 0);} else {dup2(out_fd, 0);close(out_fd);}/* Set up control and status pipes, close the unneeded original fds. */if (dup2(ctl_pipe[0], FORKSRV_FD) < 0) PFATAL("dup2() failed");if (dup2(st_pipe[1], FORKSRV_FD + 1) < 0) PFATAL("dup2() failed");close(ctl_pipe[0]);close(ctl_pipe[1]);close(st_pipe[0]);close(st_pipe[1]);close(out_dir_fd);close(dev_null_fd);close(dev_urandom_fd);close(fileno(plot_file));execv(target_path, argv);/* Use a distinctive bitmap signature to tell the parent about execv()falling through. */*(u32*)trace_bits = EXEC_FAIL_SIG;exit(0);}

可能需要理解setsid();?
簡單搜索了下,還得去理解進程相關只是,于是去問了bing,bing的回答告訴我:setsid()函數是一個系統調用,它的作用是創建一個新的會話(session),并使得當前進程成為會話的首進程(session leader),這個函數似乎和我想知道的東西沒有聯系。

問了下bing,并參考了這個博客:https://blog.csdn.net/Little_Bro/article/details/122694054,fork server的交互還和插樁有關系。

查看了AFL白皮書:https://github.com/mirrorer/afl/blob/master/docs/technical_details.txt,寫的很粗略,還是得去看作者的博客:https://lcamtuf.blogspot.com/2014/10/fuzzing-binaries-without-execve.html

Unfortunately, there is also a problem: especially for simple libraries, you may end up spending most of the time waiting for execve(), the linker, and all the library initialization routines to do their job. I’ve been thinking of ways to minimize this overhead in american fuzzy lop, but most of the ideas I had were annoyingly complicated. For example, it is possible to write a custom ELF loader and execute the program in-process while using mprotect() to temporarily lock down the memory used by the fuzzer itself - but things such as signal handling would be a mess. Another option would be to execute in a single child process, make a snapshot of the child’s process memory and then “rewind” to that image later on via /proc/pid/mem - but likewise, dealing with signals or file descriptors would require a ton of fragile hacks.

為什么不直接多次調用execve()?因為每次調用 execve()都會有一些預處理的開銷,作者想要加快這個過程。(不太了解預處理的過程,后續有需要再了解)

Luckily, Jann Horn figured a different, much simpler approach, and sent me a patch for afl out of the blue 😃 It boils down to injecting a small piece of code into the fuzzed binary - a feat that can be achieved via LD_PRELOAD, via PTRACE_POKETEXT, via compile-time instrumentation, or simply by rewriting the ELF binary ahead of the time. The purpose of the injected shim is to let execve() happen, get past the linker (ideally with LD_BIND_NOW=1, so that all the hard work is done beforehand), and then stop early on in the actual program, before it gets to processing any inputs generated by the fuzzer or doing anything else of interest. In fact, in the simplest variant, we can simply stop at main().

作者給出了一個很巧妙的解決方法,在被fuzzed的程序中插樁,讓這個程序在完成預處理后暫停(比如再main函數的第一句話暫停),然后在這里調用fork(),被fork出來的子進程將會直接跳過預處理過程,開始執行實際處理。

Once the designated point in the program is reached, our shim simply waits for commands from the fuzzer; when it receives a “go” message, it calls fork() to create an identical clone of the already-loaded program; thanks to the powers of copy-on-write, the clone is created very quickly yet enjoys a robust level of isolation from its older twin. Within the child process(fork server創建的子進程), the injected code returns control to the original binary, letting it process the fuzzer-supplied input data (and suffer any consequences of doing so). Within the parent, the shim relays the PID of the newly-crated process to the fuzzer and goes back to the command-wait loop.

作者把插入的代碼叫做slim(分隔片,還是很形象的),slim等待來自fuzzer的命令(對應run_target中的write(fsrv_ctl_fd, &prev_timed_out, 4)?),在收到fuzzer的命令后,fork server fork出來一個真正執行二進制程序的fuzzed進程,并給fuzzer返回一個pid。

這里有一個問題,函數參數是在哪里傳遞的呢?write(fsrv_ctl_fd, &prev_timed_out, 4)似乎沒有傳遞參數。

接下倆作者還討論了實際實現可能遇到的問題,以及插樁的匯編代碼

https://blog.csdn.net/Little_Bro/article/details/12269405,這個博客對插樁代碼進行了解釋,但是我目前不需要對插樁代碼理解的那么清楚,已經明白了fork server和fuzzer之間交互的邏輯

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/712439.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/712439.shtml
英文地址,請注明出處:http://en.pswp.cn/news/712439.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

13.網絡游戲逆向分析與漏洞攻防-網絡通信數據包分析工具-如果沒有工具就創造工具

內容參考于&#xff1a; 易道云信息技術研究院VIP課 上一個內容 &#xff1a;12.游戲網絡通信存在的問題 現在把游戲網絡的架構看了一個小小的大概&#xff0c;可以用它的接口發數據接收數據了&#xff0c;如果真正想用它這一套東西&#xff0c;真正核心不在于它的接口而在于…

2024GAS《聲學大講堂》

由中國電子音響行業協會主辦&#xff0c;上海市浦東新區先進音視頻技術協會承辦的GAS《聲學大講堂》2021年開播&#xff0c;三年來GAS《聲學大講堂》開設了“沉浸聲音頻與藝術”、“智能車載音頻”、“智能可穿戴”、“智能耳機”、“智能音箱”、“專業音響”、“助聽/輔聽設備…

老衛帶你學---leetcode刷題(268. 丟失的數字)

268. 丟失的數字 問題 給定一個包含 [0, n] 中 n 個數的數組 nums &#xff0c;找出 [0, n] 這個范圍內沒有出現在數組中的那個數。 示例 1&#xff1a; 輸入&#xff1a;nums [3,0,1] 輸出&#xff1a;2 解釋&#xff1a;n 3&#xff0c;因為有 3 個數字&#xff0c;所以…

R語言安裝和簡單入門HelloWorld用法

R語言安裝和簡單入門HelloWorld用法 #R語言安裝地址 https://www.r-project.org/ click->CRAN mirror->選擇China下列表&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/CRAN/ 選擇Download R for Windows 選擇base Download R-4.3.2 for Windows 下載文件R-4.3.2-…

怎么重構數據庫表結構

重構數據庫表結構是指對已有的數據庫表進行調整和優化&#xff0c;以提高數據庫的性能、可擴展性和可維護性。以下是一些重構數據庫表結構的常見步驟&#xff1a; 分析現有表結構&#xff1a;首先&#xff0c;仔細分析現有的數據庫表結構&#xff0c;了解表之間的關系和依賴關…

數據結構從入門到精通——算法的時間復雜度和空間復雜度

算法的時間復雜度和空間復雜度 前言一、算法效率1.1 如何衡量一個算法的好壞1.2 算法的復雜度 二、時間復雜度2.1 時間復雜度的概念2.2 大O的漸進表示法2.3常見時間復雜度計算舉例2.4等差數列計算公式2.5等比數列計算方法 三、空間復雜度四、 常見復雜度對比五、 復雜度的oj練習…

ts學習:is關鍵詞

is關鍵詞主要用來框定類型并實現對應的類型斷言&#xff0c;下面看一個例子 寫一個簡單函數來判斷某個值是否是字符串類型 function isString(value:unknown):boolean{return typeof value "string" } 這里我們的參數選用了unknown類型&#xff0c;該類型就是一個…

python代碼優化學習

代碼優化對比&#xff1a; 優化前&#xff1a; # 登錄系統 xxljob_login() start_time time.time() # 循環處理需要補數的數據 for item in authId_lists: preSettleInfoHandler(item) count 1 print("運行了第" str(count) "個") …

數據分析---主要工作

目錄 幾個主要工作常用的數據分析工具具體的使用場景幾個主要工作 數據清洗和預處理:對原始數據進行清洗、去重、填充缺失值、處理異常值等操作,以確保數據的準確性和完整性。探索性數據分析(EDA):通過可視化和統計方法,對數據進行探索,發現數據的分布、相關性、異常情況…

【JVM】聊聊常見的JVM排查工具

JDK工具包 jps 虛擬機進程狀況工具 jps是虛擬機進程狀況工具&#xff0c;列出正在運行的虛擬機進程&#xff0c;使用 Windows 的任務管理器或 UNIX 的 ps 命令也可以查詢&#xff0c;但如果同時啟動多個進程&#xff0c;必須依賴 jps。jps -l 顯示類名 jps :列出Java程序進程…

linux vi 退出編輯狀態

在 vi 編輯器中&#xff0c;要退出編輯狀態并保存或者放棄更改&#xff0c;需要執行以下步驟&#xff1a; 1. 保存并退出&#xff1a; - 按下 Esc 鍵確保你處于正常模式&#xff08;Normal Mode&#xff09;。 - 輸入 :wq&#xff0c;然后按下 Enter 鍵。這將保存更改并…

SVPWM

SVPWM SVPWMSVPWM原理產品比較特點來源 SVPWM SVPWM的主要思想是以三相對稱正弦波電壓供電時三相對稱電動機定子理想磁鏈圓為參考標準&#xff0c;以三相逆變器不同開關模式作適當的切換&#xff0c;從而形成PWM波&#xff0c;以所形成的實際磁鏈矢量來追蹤其準確磁鏈圓。傳統…

3.1作業

改變圖片色彩————德國國旗 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> int main(int argc, const char *argv[]) {FILE* fpfopen("./haha.bmp","r");int h0,w0;fseek(fp,18,SEEK_SET)…

yolo訓練時遇到GBK編碼問題

yolo訓練時遇到GBK編碼問題 啟動訓練具體信息如下&#xff1a; comet upload E:\python\yolov9-main.cometml-runs\e0c17dd22058467f98cf447d5cc45bf5.zip COMET INFO: Using ‘D:\pycharmProject\yolov5-master-6.2\.cometml-runs’ path as offline directory. Pass ‘off…

高比例清潔能源接入下計及需求響應的配電網重構(matlab代碼)

目錄 1 主要內容 目標函數 重要約束條件 2 部分代碼 3 程序結果 4 下載鏈接 1 主要內容 該程序復現《高比例清潔能源接入下計及需求響應的配電網重構》&#xff0c;以考慮網損成本、棄風棄光成本和開關操作懲罰成本的綜合成本最小為目標&#xff0c;針對配電網重構模型的…

3694-51-7,3,5-Dinitro-1,2-phenylenediamine,合成其他化合物的重要中間體

您好&#xff0c;歡迎來到新研之家 文章關鍵詞&#xff1a;3694-51-7&#xff0c;3,5-Dinitro-1,2-phenylenediamine&#xff0c;3,5-二硝基-1,2-苯二胺;3,5-二硝基苯-1,2-二胺 一、基本信息 【產品簡介】&#xff1a;3,5-Dinitro-1,2-phenylenediamine, with the molecular…

提取抖店賣家電話的爬蟲軟件

介紹&#xff1a; 如今&#xff0c;電商平臺上的抖店賣家數量龐大&#xff0c;對于想要聯系賣家的買家來說&#xff0c;獲取賣家的聯系電話是一項相當繁瑣的任務。為了簡化這個過程&#xff0c;我們可以借助Python編寫一個抖店賣家電話提取爬蟲軟件&#xff0c;快速獲取所需的聯…

SpringBoot啟動擴展應用:干預優化+加快啟動時間(干貨典藏版)

一、SpringBoot啟動過程干預 Spring Boot啟動過程中我們可以實現以下干預工作&#xff1a; 修改Spring Boot默認的配置屬性。使用ConfigurationProperties和EnableConfigurationProperties注解&#xff0c;可以獲取和修改Spring Boot的配置屬性。 加載配置文件。Spring Boot會…

面試數據庫篇(mysql)- 06覆蓋索引

原理 覆蓋索引是指查詢使用了索引,并且需要返回的列,在該索引中已經全部能夠找到 。 id name gender createdate 2 Arm

c++_leetcode_尋找峰值

目錄 一、尋找峰值的示例 二、官方實現代碼及解釋 1、官方測試結果&#xff1a; 2、代碼解釋&#xff1a; 3、解題思路&#xff1a; 三、我的暴力解決 1、測試一&#xff1a; 2、測試二&#xff1a; 3、最終“暴力求解”代碼&#xff1a; 4、官網提交測試通過&#xf…