它的的主要目標是在一個單一視圖中給研究人員提供包含了各種函數交叉引用的相關信息。
對于可以使用Hexrays反編譯器的情況,該工具還可以嘗試排除針對這些函數的調用。
注意事項
在運行VulFi之前,請確保已經了解了你說要測試的代碼,然后嘗試識別所有的標準函數(例如strcpy和memcpy等),然后確保它們正確命名。
插件是大小寫不敏感的,因此MEMCPY、Memcpy和memcpy都是可以識別的。
需要注意的是,搜索函數時需要精確匹配。這意味著or (或任何其他變體)不會被檢測為標準函數,因此在尋找潛在漏洞時不會被考慮。
除此之外,VulFi將盡最大努力來過濾所有明顯的誤報。
請注意,雖然插件與特定架構沒有任何聯系,但某些處理器不完全支持指定類型,在這種情況下,VulFi 將簡單地將所有交叉引用標記為潛在危險的標準函數,以便您繼續進行手動分析. 在這些情況下,您可以從插件的跟蹤功能中受益。
安裝
將vulfi.py、vulfi_prototypes.json和vulfi_rules.json文件放在 IDA 插件文件夾 ( cp vulfi*
用法
掃描
要啟動掃描,請從頂部欄菜單中選擇Search>選項。
VulFi這將啟動新的掃描,或者它將讀取存儲在idb/i64文件中的先前結果。每當您保存數據庫時,數據都會自動保存。
掃描完成或加載先前的結果后,將顯示一個包含以下列的視圖:
IssueName - 用作可疑問題的標題。
FunctionName - 函數的名稱。
FoundIn - 包含可能感興趣的引用的函數。
檢測到的呼叫的地址。
審查狀態,初始Not Checked分配給每個新項目。其他狀態是False Positive和。這些可以使用給定項目上的右鍵單擊菜單進行設置,并且應該反映給定函數調用的手動審查結果。SuspiciousVulnerable
嘗試將更有趣的呼叫優先于不太有趣的呼叫??赡艿闹禐镠igh和。優先級與文件中的其他規則一起定義。MediumLowvulfi_rules.json
給定項目的用戶定義評論。
idb如果/文件內沒有數據i64或用戶決定執行新掃描。
該插件將詢問它是否應該使用默認包含的規則運行掃描,或者是否應該使用自定義規則文件。
請注意,使用現有數據運行新掃描不會覆蓋先前找到的由規則標識的與先前存儲結果同名的項目。
因此,再次運行掃描不會刪除現有的評論和狀態更新。
在 VulFi 視圖中的右鍵單擊上下文菜單中,您還可以從結果中刪除項目或刪除所有項目。
請注意,執行此操作后,任何評論或狀態更新都將丟失。
調查
每當您想檢查檢測到的可能存在漏洞的函數的實例時,只需雙擊所需行中的任意位置,IDA 就會將您帶到被識別為可能感興趣的內存位置。
使用右鍵單擊和選項Set Vulfi Comment,您可以為給定實例輸入注釋(例如,證明狀態)。
添加更多功能
該插件還允許創建自定義規則。這些規則可以在 IDA 接口中定義(適用于單個功能)或作為自定義規則文件提供(適用于旨在涵蓋多個功能的規則)。
界面內
當您想要跟蹤在分析期間識別的自定義函數時,只需將 IDA 視圖切換到該函數,右鍵單擊其主體內的任意位置并選擇Add current function to VulFi
。
自定義規則集
也可以加載具有多個規則集的自定義文件。要創建具有以下結構的自定義規則文件,您可以在此處使用包含的模板文件。
[ // 規則數組
{
"name" : " RULE NAME " , // 規則的名稱
"alt_names" :[
" function_name_to_look_for " // 應與此規則中定義的條件匹配的所有函數名稱的列表
],
"wrappers" : true , // 也尋找上述函數的包裝器(注意包裝的函數也必須匹配規則)
"mark_if" :{
"High" : " True " , // If 計算結果為 True,標記為高優先級(參見下面的規則)
“中”:“假”,//如果計算結果為真,則標記為優先中(參見下面的規則)
“低”:“假” //如果計算結果為真,優先標記低(見下面的規則)
}
}
]
查找所有對函數的交叉引用malloc并檢查其參數是否不是常量以及是否檢查函數的返回值的示例規則如下所示:
{
“名稱”:“可能的空指針取消引用”,
“ alt_names” :[
“ malloc ”,
“ _ malloc” ,
“. malloc ”
],
“包裝器”:假,
“mark_if”:{
“高”:“不是 param[0].is_constant() 而不是 function_call.return_value_checked() ”,
“中”:“假”,
“低”:“假”
}
}
規則
可用變量
param[]: 用于訪問函數調用的參數(索引從 開始0)
function_call:用于訪問函數調用事件
param_count: 保存傳遞給函數的參數計數
可用功能
參數是否為常數:param[].is_constant()
獲取參數的數值:param[].number_value()
獲取參數的字符串值:param[].string_value()
調用后參數是否設置為null:param[].set_to_null_after_call()
是否檢查函數的返回值:function_call.return_value_checked()
例子
標記對第三個參數大于 5 的函數的所有調用:param[2].number_value() > 5
標記對第二個參數包含“%s”的函數的所有調用:"%s" in param[1].string_value()
標記對第二個參數不是常量的函數的所有調用:not param[1].is_constant()
標記對函數的所有調用,其中根據等于參數數量的值驗證返回值:function_call.return_value_checked(param_count)
標記對返回值針對任何值進行驗證的函數的所有調用:function_call.return_value_checked()
標記對一個函數的所有調用,其中從第三個開始的參數都不是常量:all(not p.is_constant() for p in param[2:])
標記對任何參數為常量的函數的所有調用:any(p.is_constant() for p in param)
標記對函數的所有調用:True
審核編輯 :李倩
-
二進制
+關注
關注
2文章
795瀏覽量
41720 -
編譯器
+關注
關注
1文章
1642瀏覽量
49228 -
漏洞
+關注
關注
0文章
204瀏覽量
15404
原文標題:一款漏洞查找器(挖漏洞的有力工具)
文章出處:【微信號:菜鳥學信安,微信公眾號:菜鳥學信安】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論