ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

VulFi 进阶技巧:包装函数追踪与危险调用可达性分析

VulFi 进阶技巧:包装函数追踪与危险调用可达性分析

VulFi 进阶技巧:包装函数追踪与危险调用可达性分析

【免费下载链接】VulFiIDA Pro plugin for query based searching within the binary useful mainly for vulnerability research.项目地址: https://gitcode.com/gh_mirrors/vu/VulFi

VulFi(Vulnerability Finder)是一款基于 IDA Pro 的漏洞挖掘辅助插件,它以"查询式搜索"为核心,自动收集二进制中strcpysprintfsystem等危险函数的全部交叉引用,并借助 Hex-Rays 反编译器过滤明显误报,帮助安全研究员把精力集中在真正有威胁的调用点上。本文介绍的两大进阶技巧——包装函数追踪危险调用可达性分析,正是挖掘深层漏洞、提升人工审计效率的关键手段。

为什么基础扫描会漏掉真正的漏洞

VulFi 的默认规则会扫描所有对危险标准函数的直接调用,但真实世界的二进制很少"裸奔":

  • 开发者通常会把systemmemcpy等函数封装进自己的业务函数(包装函数 / wrapper),再在几十个地方调用这个包装函数。
  • 直接调用虽然能被默认规则发现,但包装层会打断参数的数据流,导致 VulFi 无法准确判断参数是否可控、返回值是否被检查。

只依赖基础扫描,往往只能看到"冰山一角"。接下来介绍的两种进阶玩法,能帮你把这类隐藏调用一网打尽。

包装函数追踪:让间接调用无所遁形

VulFi 在规则文件中提供了wrappers开关。当把它设为true时,插件不仅会标记对目标函数的直接调用,还会自动向上追踪"只负责传递参数的包装函数",把调用包装函数的代码位置也一并列出。官方自带的 vulfi_rules.json 中,Possible Dangling Pointer(悬垂指针)规则就是一个典型示例,它对freeoperator delete开启了包装追踪。

包装函数追踪的判定逻辑位于 vulfi.py 的get_wrapper_xrefs中:它会反编译调用点,检查被调用函数的参数是否全部原样来自调用者的入参——只有当包装函数"无添加、纯透传"参数时,才被认为是可信的 wrapper,从而避免把无关函数误判为包装层。

在扫描完成后,VulFi 会以xxx (system wrapper)的形式在结果表中标注包装调用,让你一眼看出哪里的代码通过包装函数触发了危险操作。

危险调用可达性分析:判断攻击面是否真的可控

找到调用点之后,下一个关键问题是:这个危险调用真的能被攻击者触达吗?VulFi 提供了reachable_from判断函数,用于检查某个调用是否可以从指定的函数(例如输入处理函数readrecvsscanf)沿调用链可达。

使用方法非常简单,在规则的自定义条件中写入:

function_call.reachable_from("read")

这条规则的含义是:标记所有从read函数可达的危险函数调用。如果某个system调用与用户输入函数位于同一条调用链上,它就会进入结果列表并被赋予相应优先级;反之,那些只被内部初始化代码调用的危险函数则会被过滤掉,帮助你迅速聚焦真正的攻击面。

这项功能不依赖 Hex-Rays,仅基于 IDA 的交叉引用解析即可工作,因此即使在没有反编译器的环境中也能正常使用。

组合进阶规则:包装追踪 + 可达性分析

把两种技巧结合起来,威力更大。例如,针对命令注入场景,你可以编写如下自定义规则(参考模板 rule_template_file.json):

  • systempopenexecve开启包装函数追踪,捕获所有间接调用;
  • 结合reachable_from("read")条件,只保留与外部输入处理函数有调用链关联的条目;
  • 再叠加参数判断:not param[0].is_constant(),排除参数为硬编码字符串的误报。

这样,VulFi 的扫描结果就会从"海量调用"收敛为"真正值得人工审计的高危点",大幅压缩漏洞挖掘的时间成本。

提升扫描准确率的实用技巧

即使不使用 Hex-Rays,VulFi 也内置了对常量参数的识别优化。它能够识别通过变量传递的静态字符串(例如根据条件分支执行不同的固定命令),并将其标记为低优先级,避免你在system("echo hello")这类安全调用上浪费时间。

此外,自定义规则可用的判断函数非常丰富:param[i].is_constant()判断参数是否常量、function_call.return_value_checked()判断返回值是否被检查、param[i].used_in_call_before(["strlen"])判断参数是否先经过长度校验——把这些组合进mark_if条件,就能精细控制每一条规则的命中逻辑与优先级。

批量审查:让结果管理更高效

扫描完成后,VulFi 会以表格形式呈现每个可疑调用,包含漏洞类型、所在函数、地址、状态和优先级。你可以双击任意一行跳转到 IDA 中的对应位置进行人工确认。

从 2.1 版本开始,VulFi 还支持多选操作:按住Ctrl选中多行后,可以批量标记状态(False Positive/Suspicious/Vulnerable)、批量添加注释或删除条目。如果界面没有即时刷新,按几次Ctrl+U即可强制刷新视图。审查结论会随数据库一起保存,下次打开时依然保留,方便团队协作与审计留痕。

小结

包装函数追踪解决了"调用被封装、扫描看不见"的问题,危险调用可达性分析则回答了"调用能不能被攻击者触达"的核心问题。两者结合,配合 vulfi_rules.json 中丰富的自定义判断函数,VulFi 就能从简单的交叉引用收集器,升级为一台真正面向漏洞挖掘的精准扫描引擎。建议你在分析新二进制时,先跑一遍默认规则建立全局视图,再针对具体业务函数添加带包装追踪与可达性判断的自定义规则,把每次审计都做得又快又准。

【免费下载链接】VulFiIDA Pro plugin for query based searching within the binary useful mainly for vulnerability research.项目地址: https://gitcode.com/gh_mirrors/vu/VulFi

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

返回列表