目录导航
项目地址
GitHub:
https://github.com/Accenture/VulFi
VulFi简介
VulFi(漏洞查找器-Vulnerability Finder)工具是 IDA Pro 的一个插件,可用于协助在二进制文件中寻找漏洞。它的主要目标是提供一个单一视图,其中包含对最有趣的功能(例如strcpy
、sprintf
、system
等)的所有交叉引用。对于可以使用 Hexrays 反编译器的情况,它将尝试排除对这些函数的调用,这些函数从漏洞研究的角度来看并不有趣(想想类似的东西strcpy(dst,"Hello World!")
)。如果没有反编译器,规则会简单得多(不依赖于架构),因此只排除最明显的情况。

安装
将vulfi.py
、vulfi_prototypes.json
和vulfi_rules.json
文件放在 IDA 插件文件夹 ( cp vulfi* <IDA_PLUGIN_FOLDER>
) 中。
准备数据库文件
在运行 VulFi 之前,请确保您对使用的二进制文件有充分的了解。尝试识别所有标准函数(strcpy
、memcpy
等)并相应地命名它们。该插件不区分大小写,因此,MEMCPY
都是有效名称。但是,请注意,该函数的搜索需要完全匹配。这意味着or (或任何其他变体)不会被检测为标准功能,因此在寻找潜在漏洞时不会被考虑。如果您正在使用未知的二进制文件,则需要首先设置编译器选项> 。之后,VulFi 将尽最大努力过滤所有明显的误报(例如调用Memcpy
memcpy
memcpy?
std_memcpy
Options
Compiler
printf
以常量字符串作为第一个参数)。请注意,虽然插件与特定架构没有任何联系,但某些处理器不完全支持指定类型,在这种情况下,VulFi 将简单地将所有交叉引用标记为潜在危险的标准函数,以便您继续进行手动分析. 在这些情况下,您可以从插件的跟踪功能中受益。
用法
扫描
要启动扫描,请从顶部栏菜单中选择Search
>选项。VulFi
这将启动新的扫描,或者它将读取存储在idb
/i64
文件中的先前结果。每当您保存数据库时,数据都会自动保存。
扫描完成或加载先前的结果后,将显示一个包含以下列的视图:
- IssueName – 用作可疑问题的标题。
- FunctionName – 函数的名称。
- FoundIn – 包含可能感兴趣的引用的函数。
- Address – 检测到的呼叫的地址。
- Status – 审查状态,初始
Not Checked
分配给每个新项目。其他状态是False Positive
和。这些可以使用给定项目上的右键单击菜单进行设置,并且应该反映给定函数调用的手动审查结果。SuspiciousVulnerable
- Priority – 尝试将更有趣的呼叫优先于不太有趣的呼叫。可能的值为
High
和。优先级与文件中的其他规则一起定义。MediumLowvulfi_rules.json
- Comment – 给定项目的用户定义评论。
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 " ,
// 如果计算结果为真
,则标记为高优先级(参见下面的规则)评估为真,标记为低优先级(参见下面的规则)
}
}
]
查找所有对函数的交叉引用malloc
并检查其参数是否不是常量以及是否检查函数的返回值的示例规则如下所示:
{
"name": "Possible Null Pointer Dereference",
"alt_names":[
"malloc",
"_malloc",
".malloc"
],
"wrappers":false,
"mark_if":{
"High":"not param[0].is_constant() and not function_call.return_value_checked()",
"Medium":"False",
"Low": "False"
}
}
规则
可用变量
param[<index>]
: 用于访问函数调用的参数(索引从 开始0
)function_call
:用于访问函数调用事件param_count
: 保存传递给函数的参数计数
可用功能
- 参数是否为常数:
param[<index>].is_constant()
- 获取参数的数值:
param[<index>].number_value()
- 获取参数的字符串值:
param[<index>].string_value()
- 调用后参数是否设置为null:
param[<index>].set_to_null_after_call()
- 是否检查函数的返回值:
function_call.return_value_checked(<constant_to_check>)
例子
- 标记对第三个参数大于 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
问题和警告
- 当您请求索引超出范围的参数时,对函数的任何调用都将被标记为
Low
优先级。这是一种避免在无法正确获取所有参数的情况下丢失交叉引用的方法(这主要适用于反汇编模式)。 - 当您在 VulFi 视图中搜索并从视图中更改上下文并返回时,该视图将不会加载。您可以通过在切换上下文之前终止搜索操作、将 VulFi 视图移动到侧视图以使其始终可见或关闭并重新打开视图(不会丢失数据)来解决此问题。
- 对更多奇特架构的扫描以大量误报告终。
插件下载地址
GitHub:
https://github.com/Accenture/VulFi.zip
云中转网盘:
https://yzzpan.com/#sharefile=eNg8Ov4B_37227
解压密码:www.ddosi.org
转载请注明出处及链接