国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      一種代碼靜態(tài)檢測(cè)方法_5

      文檔序號(hào):9249188閱讀:來源:國知局
      pl].val, op2_val=PT.WkState[op2].val,對(duì)于ge1:PCSk〇nd,true)其生成的字符串形式的約 束結(jié)果為'(assert(op_handopl_valop2_val))',對(duì)于ge1:PCS(cond,false)其結(jié)果 為'(assert(not(op_handopl_val〇92_¥31_)))',?1'_。的賦值與?1'_1'類似,最后判斷兩 條分支的約束條件是否滿足,如果滿足則將相應(yīng)路徑放入PTS中,等待之后解釋執(zhí)行,判斷 當(dāng)前約束條件是否滿足的操作調(diào)用步驟(3)。
      [0182] (27)判斷步驟(25)或步驟(26)直到發(fā)現(xiàn)致命性錯(cuò)誤或者PTS為空,否則PT.it++ 繼續(xù)執(zhí)行步驟(23)至步驟(26)。
      [0183] (3)根據(jù)記錄各個(gè)變量在不同路徑上的符號(hào)值和各條路徑的約束條件,調(diào)用SMT 求解器Z3檢查變量的符號(hào)值是否滿足路徑約束和漏洞約束,判斷程序是否存在潛在漏洞。 調(diào)用SMT求解器Z3檢查變量的符號(hào)值是否滿足路徑約束和漏洞約束的具體步驟如下:
      [0184] (31)從PT. WkState開始順著PT. WkState. pre鏈向上遍歷到頭結(jié)點(diǎn),對(duì)于每一 個(gè)blkState對(duì)象,將其pcs中的所有約束順次連接,形成一個(gè)總的路徑約束PC1 ;
      [0185] 魄)掃描PC1,探測(cè)其中的自由變量,自由變量符合正則表達(dá)式val_[0-9]+,為每 一個(gè)自由變量生成聲明,對(duì)于自由變量乂31_;[生成聲明字符串'(declare-constval_i(_ BitVec32)))',將聲明連接并記為DF;
      [0186] (33)將DF和PCI連接,形成符合SMTLIB2. 0規(guī)范的SMT約束PC,將PC送交Z3求 解;
      [0187] (34)將Z3返回的結(jié)果z3: :sat和z3: :unsat分別表不為true和false的形式, 然后再返回,z3: :sat對(duì)應(yīng)true,z3::unsat對(duì)應(yīng)false,其中z3: :sat和z3::unsat是z3 的C++庫中定義的兩個(gè)常數(shù)分別表示可滿足和不可滿足??蓾M足和不可滿足所針對(duì)的只是 一組約束條件,它是否有解的問題;如果是在遇到分支判斷時(shí)調(diào)用步驟(3)進(jìn)行判斷,可滿 足則意味著該條路徑的某一個(gè)分支是可行的,不可滿足則代表該路徑不可行;如果是在判 斷漏洞時(shí),調(diào)用步驟(3)可滿足確實(shí)代表存在漏洞。
      [0188] 本發(fā)明已經(jīng)通過上述實(shí)施例進(jìn)行了說明,但應(yīng)當(dāng)理解的是,上述實(shí)施例只是用于 舉例和說明的目的,而非意在將本發(fā)明限制于所描述的實(shí)施例范圍內(nèi)。此外本領(lǐng)域技術(shù)人 員可W理解的是,本發(fā)明并不局限于上述實(shí)施例,根據(jù)本發(fā)明的教導(dǎo)還可W做出更多種的 變型和修改,該些變型和修改均落在本發(fā)明所要求保護(hù)的范圍W內(nèi)。本發(fā)明的保護(hù)范圍由 附屬的權(quán)利要求書及其等效范圍所界定。
      【主權(quán)項(xiàng)】
      1. 一種代碼靜態(tài)檢測(cè)方法,其特征在于,如下步驟: (1) 獲取源代碼,并將源代碼進(jìn)行預(yù)處理轉(zhuǎn)換為LLVM匯編程序; (2) 將轉(zhuǎn)換得到的LLVM匯編程序,運(yùn)用符號(hào)執(zhí)行算法模擬解釋執(zhí)行LLVM匯編程序,并 記錄各個(gè)變量在不同路徑上的符號(hào)值和各條路徑的約束條件; (3) 根據(jù)記錄各個(gè)變量在不同路徑上的符號(hào)值和各條路徑的約束條件,調(diào)用SMT求解 器Z3檢查變量的符號(hào)值是否滿足路徑約束和漏洞約束,判斷程序是否存在潛在漏洞。2. 根據(jù)權(quán)利要求1所述的一種代碼靜態(tài)檢測(cè)方法,其特征在于:所述步驟(1)中,將源 代碼進(jìn)行預(yù)處理轉(zhuǎn)換為LLVM匯編程序的具體步驟如下: (11) 調(diào)用編譯器clang檢查源代碼是否存在語法錯(cuò)誤,如有錯(cuò)誤,修改語法錯(cuò)誤直到 編譯器不報(bào)錯(cuò),以得到語法正確的源代碼; (12) 將得到的語法正確的源代碼利用編譯器Clang轉(zhuǎn)化為LLVM匯編程序。3. 根據(jù)權(quán)利要求2所述的一種代碼靜態(tài)檢測(cè)方法,其特征在于:所述步驟(2)中,模擬 解釋執(zhí)行LLVM匯編程序的具體步驟如下: (21) 調(diào)用LLVM基礎(chǔ)庫,將LLVM匯編程序輸入LLVM基礎(chǔ)庫并轉(zhuǎn)化為文本形式程序的 LLVM匯編程序CFG,LLVM基礎(chǔ)庫返回的CFG中包含的具體對(duì)象有全局變量,全局變量對(duì)應(yīng) 全局變量對(duì)象g,每一個(gè)函數(shù)LLVM匯編程序?qū)?yīng)函數(shù)對(duì)象F,每個(gè)函數(shù)對(duì)象F包含函數(shù)參數(shù) P和若干代碼塊b,而每個(gè)代碼塊又包含多個(gè)指令instruction; (22) 對(duì)于被分析函數(shù)對(duì)象,為其引用到全局變量對(duì)象、函數(shù)參數(shù)和內(nèi)存對(duì)象,內(nèi)存對(duì)象 是一個(gè)四元組,其結(jié)構(gòu)為: SValue= (tpX val XptrXdata) G (llvm: :Type*XStringXSValue*X (intXSVal ue*)), 其中SValue是內(nèi)存對(duì)象,用于描述各變量的符號(hào)狀態(tài),tp、val、ptr和data分別是,tp代表數(shù)據(jù)的類型,val代表符號(hào)值,表示一個(gè)字符串的類型為String,ptr代表符號(hào)指針值, data是一個(gè)數(shù)字到符號(hào)值指針的映射,用于記錄數(shù)組類型和結(jié)構(gòu)體,llvm: :Type*,String, SValue*,(intXSValue*)分別是對(duì)應(yīng)分量tp、val、ptr、data的數(shù)據(jù)類型,Llvm::Type是 LLVM基礎(chǔ)庫中的一個(gè)描述LLVM匯編程序類型的對(duì)象,LLVM: :Type*代表該類型對(duì)象的指 針,String是C++標(biāo)準(zhǔn)庫中的字符串對(duì)象類型,SValue是內(nèi)存對(duì)象,也稱為符號(hào)對(duì)象,int 代表C++基礎(chǔ)類型中的整數(shù)類型; 系統(tǒng)的初始狀態(tài)為PT、PTS,首先初始化一個(gè)長度為1的根路徑PT,將該路徑存放到可 執(zhí)行路徑PTS中,解釋執(zhí)行的過程類似于一個(gè)有限狀態(tài)機(jī)的狀態(tài)迀移,解釋器的狀態(tài)以PT 和PTS進(jìn)行描述,每解釋執(zhí)行一條指令狀態(tài)就發(fā)生迀移,將初始化好的第一條路徑放入PTS 中;這些初始化的過程可以表示為如下指令語義模式操作公式:其中,PT代表當(dāng)前正在探索的可行路徑,PTS代表目前發(fā)現(xiàn)的所有未探測(cè)的可行路徑 集合,B代表LLVM匯編程序CFG中的一個(gè)代碼塊,PT.currB代表當(dāng)前路徑正在探索的代碼 塊,F(xiàn)表示當(dāng)前正在被分析的函數(shù),F(xiàn).firstBlock代表函數(shù)的第一個(gè)代碼塊,PT.vars代表 路徑上所有的變量,它是一個(gè)映射,PT.vars[key=value]代表的是將鍵值對(duì)(key,value) 存入映射vars當(dāng)中,其中key代表映射的索引,value代表映射的key索引所對(duì)應(yīng)的值, key和value可以被替換為各種值,公式中PT.vars[g=SValue(g.type()),p=SValue(p. type())]是PT.vars[g=SValue(g.typeO)]和PT.vars[p=SValue(p.typeO)]的 縮寫形式,代表將鍵值對(duì)(8,3\^1116&47?6〇))和&,5\^11116化47?6))存入?1'.¥&『8 中,此處的g和P作為key,SValue(g.type())和SValue(p.type)則作為值value部分, SValue(type)是符號(hào)對(duì)象的構(gòu)造函數(shù),它有一個(gè)參數(shù)type表明符號(hào)對(duì)象,即表示數(shù)據(jù)的類 型,g代表全局變量,g.type()表示全局變量的類型,p代表函數(shù)F的參數(shù),p.type()表示參 數(shù)的類型,SValue(p.type())代表根據(jù)參數(shù)p的類型構(gòu)造內(nèi)存對(duì)象,SValue(g.type())代 表根據(jù)全局變量g的類型構(gòu)造內(nèi)存對(duì)象,PT.it代表當(dāng)前路徑所執(zhí)行到的指令,PT.currB. firstlnstruction代表當(dāng)前路徑當(dāng)前塊的第一條指令,PTS.add(PT)將一條路徑PT添加到 可行路徑集合PTS中,init代表這是一個(gè)初始化動(dòng)作,在任何具體指令分析之前應(yīng)該進(jìn)行 該操作,它不對(duì)應(yīng)任何指令; (23) 判斷PTS是否為空,如果PTS不為空,則彈出其中一條路徑存放到PT中,并執(zhí)行步 驟(24);若PTS為空,則模擬執(zhí)行結(jié)束; (24) 若PT路徑中的當(dāng)前執(zhí)行位置PT.it所指指令為非跳轉(zhuǎn)指令,則執(zhí)行步驟(25),否 則執(zhí)行(26); (25) 根據(jù)不同的非跳轉(zhuǎn)指令類型,執(zhí)行不同的指令語義模式操作公式; (26) 根據(jù)不同的跳轉(zhuǎn)指令類型,執(zhí)行不同的指令語義模式操作公式; (27) 判斷步驟(25)或步驟(26)直到發(fā)現(xiàn)致命性錯(cuò)誤或者PTS為空,否則PT.it++繼 續(xù)執(zhí)行步驟(23)至步驟(26)。4.根據(jù)權(quán)利要求3所述的一種代碼靜態(tài)檢測(cè)方法,其特征在于:所述步驟(22)中,指 令語義模式的結(jié)構(gòu)如下公式所示:其中〈currentstate〉代表系統(tǒng)的當(dāng)前狀態(tài),〈endstate〉代表語句執(zhí)行后程序的狀 態(tài),computation是狀態(tài)迀移計(jì)算過程的一些細(xì)節(jié)展示,stmt代表被執(zhí)行的語句包含的所 有指令,具體指令如下所示:Il代表函數(shù)返回指令,它分為有參數(shù)值和無參數(shù)值返回,無參數(shù)值retvoid,有參數(shù)值ret〈type>〈value>,其中〈value〉代表具體的返回值,〈type〉代表返回值的類型,ret表示 這是一條函數(shù)返回; 12代表有條件跳轉(zhuǎn)指令,其中<cond>代表跳轉(zhuǎn)的條件,il代表布爾類型,〈iftrue〉 代表?xiàng)l件為真時(shí)跳轉(zhuǎn)到的目標(biāo)代碼塊,〈iffalse〉代表?xiàng)l件為假時(shí)跳轉(zhuǎn)到的目標(biāo)代碼塊, label代表是一個(gè)標(biāo)簽類型,br表示這是一條跳轉(zhuǎn)指令; 13代表無條件跳轉(zhuǎn)指令,〈dest>代表無條件跳轉(zhuǎn)到的目標(biāo)代碼塊,label代表是一個(gè) 標(biāo)簽類型,br表示這是一條跳轉(zhuǎn)指令; 14代表算術(shù)運(yùn)算指令,[add|sub|mul|udiv|sdiv|urem|srem]代表的是算術(shù)運(yùn)算的 具體操作類型,<ty>代表兩個(gè)操作數(shù)的數(shù)據(jù)類型,<opl>和<op2>分別是兩個(gè)操作數(shù), 〈result〉代表算術(shù)運(yùn)算結(jié)果; 15代表比較指令,其中<c〇nd>代表的是比較的具體類型,如大于、小于還是等于,<ty> 代表操作數(shù)的數(shù)據(jù)類型,<〇pl>和<〇p2>分別代表比較的兩個(gè)操作數(shù),icmp表示這是一條比 較指令,〈:result〉代表比較結(jié)果; 16代表的是局部變量內(nèi)存分配指令,〈type〉代表變量的類型,該指令的語義是為 局部變量在棧上分配一定的內(nèi)存,模擬執(zhí)行時(shí),會(huì)為指定局部變量分配相應(yīng)的內(nèi)存對(duì)象 SValue,〈tyXNumElements〉為可選部分,〈NumElements〉代表分配的元素的個(gè)數(shù),<ty>代 表〈NumElements〉的數(shù)據(jù)類型,alloca表示這是一個(gè)棧內(nèi)存分配分配指令,〈result〉代表 分配的棧內(nèi)存對(duì)象; 17是內(nèi)存加載指令,〈pointer〉代表具體的指針,<ty>代表指針指向?qū)ο蟮臄?shù)據(jù)類型,load表示這是一條內(nèi)存加載指令,〈result〉代表被加載的數(shù)據(jù); 18是內(nèi)存存貯指令,〈pointer〉代表存貯的內(nèi)存位置,〈value〉代表被存貯的對(duì)象; <ty>代表了被存貯對(duì)象的數(shù)據(jù)類型,store代表這是一條內(nèi)存存貯指令; 19是數(shù)組或結(jié)構(gòu)體子元素獲取指令,〈ptrval〉代表數(shù)組或結(jié)構(gòu)體對(duì)象,<pty>*代表 〈ptrval〉的類型,<idx>代表子元素所在的索引為可選部分,<ty>代表<idx>的數(shù)據(jù)類型, getelementptrinbounds表示這是一條子元素獲取指令,〈result〉是指令執(zhí)行結(jié)果; IlO是函數(shù)調(diào)用指令,〈functionptrval>代表被調(diào)用函數(shù)對(duì)象,〈ptrtofunction ty>表示函數(shù)的類型,〈functionargs>表示函數(shù)參數(shù),invoke表示這是一條函數(shù)調(diào)用指 令,〈result〉表示函數(shù)調(diào)用返回值; 上述各指令的各個(gè)分量都可以從對(duì)象化的LLVM匯編程序中獲取,并且以對(duì)象的形式 存在。5.根據(jù)權(quán)利要求4所述的一種代碼靜態(tài)檢測(cè)方法,其特征在于:所述步驟(25)中,執(zhí) 行不同的指令語義模式操作公式的公式如下: 若當(dāng)前指令是函數(shù)返回指令(II),按如下公式迀移系統(tǒng)狀態(tài):其中,PT表示當(dāng)前正在探索的可行路徑,PTS是當(dāng)前已經(jīng)發(fā)現(xiàn)的所有可行路徑集合,PTS.popO表示從當(dāng)前的可行路徑集合中彈出一條路徑,ret[void|〈type>〈value>]表示 一條函數(shù)返回指令; 若當(dāng)前指令是算術(shù)運(yùn)算指令(14),按如下公式迀移系統(tǒng)狀態(tài):其中,PT表示當(dāng)前正在探索的路徑,PTS是當(dāng)前已經(jīng)發(fā)現(xiàn)的所有可行路徑集合,PT.WkState是路徑PT的當(dāng)前塊所對(duì)應(yīng)的狀態(tài),其中記錄了解釋執(zhí)行過程中各個(gè)變量 的值的變化情況,〈result〉=[addIsub|mul|udiv|sdiv|urem|srem]<ty>〈opl>,<op2> 是算術(shù)運(yùn)算指令,opl和〇p2是算術(shù)運(yùn)算的兩個(gè)操作數(shù),result表示算術(shù)運(yùn)算的結(jié)果, PT.blkState[opl]表示的是以opl為
      當(dāng)前第5頁1 2 3 4 5 6 
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
      1