driller 符號(hào)執(zhí)行+fuzz漏洞挖掘思路
http://cs.ucsb.edu/~chris/research/doc/ndss16_driller.pdf
先看一段程序
int main()
{
config_t* config=read_config();
if (config==null){
puts("config error\n");
return -1;
}
if (config->magic!=MAIGIC_NUMBER){
puts("magic number error\n");
return -1;
}
initialize(config);
char* directive=config->directive[0];
if(!strcmp(directive,"crash_string")){
program_bug();
}
if(!strcmp(directive,"set_config"){
program_bug();
}
else{
default();
}
}
fuzz engine首先fuzz第一部分read_config(),initialize()

driller_fig2.png
遇到比較magic number的程序段,調(diào)用 concolic execution engine來找到能通過檢測(cè)的輸入,來到達(dá)程序的其他部分

driller_fig2.png
fuzz engine找到default()

driller_fg3.png
concolic engine找到滿足約束條件的輸入來達(dá)到program_bug()
僅僅通過fuzz和符號(hào)執(zhí)行本身是無法找到program_bug(),initialize()中有非常多狀態(tài),
這會(huì)導(dǎo)致路徑爆炸,導(dǎo)致符號(hào)執(zhí)行失敗,在遇到比較MAIGIC_NUMBER時(shí),傳統(tǒng)的fuzz會(huì)失敗,
其他一些常見的編程方式,如比較hash值,也會(huì)導(dǎo)致fuzz失敗。
因此fuzz engine和concolic engine的混合使用有較高的潛力。這里選擇afl qemu作為
fuzz engine
driller用到的afl的一些特性
afl特性
- 通過遺傳啟發(fā)算法對(duì)輸入進(jìn)行變異,用適應(yīng)度函數(shù)對(duì)他們進(jìn)行排名.unique函數(shù)基于獨(dú)特的代碼覆蓋率,即觸發(fā)與其他輸入觸發(fā)的路徑不同的執(zhí)行路徑。
- AFL跟蹤它從輸入中看到的控制流轉(zhuǎn)換的聯(lián)合,作為源和目標(biāo)基本塊的元組。基于他們發(fā)現(xiàn)的新的控制流轉(zhuǎn)換,遺傳算法中的輸入被初始化為“繁殖”。這意味著導(dǎo)致應(yīng)用程序以不同方式執(zhí)行的輸入會(huì)在未來輸入的生成中獲得優(yōu)先權(quán)。
- 處理循環(huán)對(duì)于模糊引擎和concolic執(zhí)行引擎來說是一個(gè)復(fù)雜的問題。為了幫助減小循環(huán)的路徑空間的大小,執(zhí)行以下啟發(fā)式。當(dāng)AFL檢測(cè)到路徑包含循環(huán)迭代時(shí),將觸發(fā)次級(jí)計(jì)算以確定該路徑是否有資格進(jìn)行繁殖。AFL確定執(zhí)行的循環(huán)迭代次數(shù),并將其與先前導(dǎo)致路徑經(jīng)歷相同循環(huán)的輸入進(jìn)行比較。這些路徑全部通過其循環(huán)迭代次數(shù)的對(duì)數(shù)(即1,2,4,8等)被置于“桶”中。在遺傳算法中考慮來自每個(gè)桶的一條路徑用于繁殖。這樣,每個(gè)循環(huán)只需要考慮log(N)條路徑,而不是N條。
- 程序隨機(jī)化干擾遺傳模糊器對(duì)輸入的評(píng)估 - 在給定隨機(jī)種子下產(chǎn)生有用路徑的輸入可能不會(huì)在另一個(gè)下產(chǎn)生。我們預(yù)先將AFL的QEMU后端設(shè)置為特定的隨機(jī)種子,以確保一致的執(zhí)行。
- 之后,當(dāng)發(fā)現(xiàn)崩潰的輸入時(shí),我們使用concolic執(zhí)行引擎來恢復(fù)任何錯(cuò)誤“挑戰(zhàn) - 回應(yīng)”行為或依賴泄漏隨機(jī)性的漏洞。例如,二進(jìn)制文件中的“質(zhì)詢 - 響應(yīng)”過程會(huì)將隨機(jī)數(shù)據(jù)回傳給用戶,并期望將相同的數(shù)據(jù)回傳。在不去除隨機(jī)化的情況下,模糊組件可能每次都會(huì)通過這個(gè)檢查并探索很少的路徑。如果隨機(jī)性不變,程序每次都接受相同的輸入,讓模糊器(或concolic執(zhí)行組件)可以自由地找到這個(gè)值并隨后進(jìn)一步探索。發(fā)現(xiàn)崩潰后,隨機(jī)性可以像第V-D4節(jié)所述的那樣象征性地建模,并且崩潰輸入可以相應(yīng)地進(jìn)行修補(bǔ)。這些功能允許AFL通過應(yīng)用程序快速發(fā)現(xiàn)唯一路徑,從而在應(yīng)用程序的指定隔間內(nèi)執(zhí)行路徑發(fā)現(xiàn)工作。但是,模糊的局限性是眾所周知的。