ARTICLE DETAIL

资讯详情

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

IDA Pro IDC 与 IDAPython 脚本实战:自动化识别危险函数调用点

IDA Pro IDC 与 IDAPython 脚本实战:自动化识别危险函数调用点 IDA Pro IDC 与 IDAPython 脚本实战自动化识别危险函数调用点静态二进制代码审计的自动化刚需在针对闭源固件、大型二进制应用或恶意代码进行安全审计时手动在 IDA Pro 的函数列表和反汇编窗口中逐个查找调用点效率极低。C/C 历史遗留代码中广泛存在不安全的字符串操作与系统调用函数——如strcpy、strcat、sprintf、gets、system等。这些函数若未对输入长度进行严格校验极易诱发栈缓冲区溢出Stack Overflow与命令注入Command Injection漏洞。为了在大体量的二进制程序中迅速缩小审计靶面安全研究员通常利用脚本语言驱动 IDA 的分析引擎。IDA 提供了两种主流脚本接口早期的IDC脚本与现代的IDAPython。熟练运用 IDAPython 自动化提取交叉引用、分析调用点栈帧结构并高亮潜在风险点是二进制安全审计的核心基本功。IDC 与 IDAPython 的技术架构对比维度IDC (IDA C-like Script)IDAPython (Python SDK 绑定)语法风格类似早期 ANSI C 与 C需显式声明变量标准 Python 3支持面向对象与高级容器API 覆盖度覆盖基础的反汇编导航、打断点与数据读取完整封装 IDA C SDK支持微码Microcode与反编译器 AST第三方生态封闭无法引入外部库可无缝集成networkx、z3-solver、capstone等分析库维护与发展处于维护状态新特性支持有限社区绝对主流持续跟随 IDA 7.x/8.x/9.x 架构演进在工程化审计脚本开发中强烈推荐优先采用IDAPython而 IDC 仅在需要编写极轻量、免依赖的快速单行宏时使用。危险函数调用点自动化识别 IDAPython 脚本实现以下 IDAPython 脚本专为自动化静态审计设计能够自动遍历导入表Imports定位所有高危 C 标准库函数追溯其所有交叉引用Code XRefs分析调用处的栈帧偏移并在反汇编界面自动为高危调用点着色与添加审计注释# ---------------------------------------------------------------------- # Description : 自动化识别并审计二进制中的危险函数调用点与潜在栈溢出 # Target : IDA Pro 7.x / 8.x / 9.x (IDAPython 3) # Author : HanShuo (SiliconVagrant) # ---------------------------------------------------------------------- import idautils import idc import ida_funcs import ida_nalt import ida_xref import ida_bytes import ida_lines # 定义常见高危函数清单及其审计关注点 DANGEROUS_FUNCTIONS { strcpy: 高危栈溢出风险: 缺少长度检查的目标拷贝, strcat: 高危栈溢出风险: 字符串拼接无边界限制, sprintf: 格式化字符串与栈溢出风险, vsprintf: 格式化字符串与栈溢出风险, gets: 严重漏洞: 绝对禁止使用的危险输入函数, scanf: 格式化溢出风险: 需检查格式符是否包含 %s 无限制读取, system: 高危命令注入风险: 需审计命令字符串来源, popen: 高危命令执行风险 } def analyze_call_site(call_ea, func_name): 分析危险函数调用点所在的上下文与栈帧结构 parent_func ida_funcs.get_func(call_ea) if not parent_func: return parent_name ida_funcs.get_func_name(call_ea) frame_size parent_func.size() # 函数体大小 # 输出高危告警日志 print([!] [AUDIT ALERT] 发现高危函数调用: {:10} 位于: 0x{:08X} (所属函数: {}).format( func_name, call_ea, parent_name )) # 1. 在调用点反汇编行添加显眼的行尾注释 audit_msg [SECURITY RISK] DANGEROUS_FUNCTIONS.get(func_name, 危险调用) idc.set_cmt(call_ea, audit_msg, 0) # 2. 将高危指令所在行背景高亮标记为黄色 (0x80FFFF) idc.set_color(call_ea, idc.CIC_ITEM, 0x80FFFF) def scan_dangerous_api_calls(): print(\n * 70) print([*] 开始执行危险函数调用点全自动静态代码审计...) print( * 70) matched_import_count 0 total_xrefs 0 # 1. 遍历二进制导入表 import_count ida_nalt.get_import_module_qty() for i in range(import_count): def import_callback(ea, name, ord): nonlocal matched_import_count, total_xrefs if not name: return True clean_name name.lstrip(_) # 兼容 _strcpy / __strcpy 等前缀 if clean_name in DANGEROUS_FUNCTIONS: matched_import_count 1 print(\n[] 命中高危导入符号: {:12} (导入地址: 0x{:08X}).format(name, ea)) # 2. 遍历该符号的所有代码交叉引用 (XRefs) for xref in idautils.XrefsTo(ea): if xref.iscode: # 仅关注代码段调用 total_xrefs 1 analyze_call_site(xref.frm, clean_name) return True ida_nalt.enum_import_names(i, import_callback) print(\n * 70) print([*] 静态审计完成! 共匹配到 {} 个高危符号标记了 {} 处可疑调用点。.format( matched_import_count, total_xrefs )) print( * 70 \n) if __name__ __main__: scan_dangerous_api_calls()进阶审计微码Microcode与参数回溯单纯依靠交叉引用只能定位调用点在实际工程中往往会产生大量误报例如开发者使用了strcpy(dst, fixed_const)拷贝已知短字符串。为了提高审计精度可结合 Hex-Rays 反编译微码 API 进行进阶分析1. Hex-Rays AST 污点参数回溯利用ida_hexrays.decompile获取反编译生成的抽象语法树AST分析危险函数的第一个参数目标缓冲区dst是否为栈上数组分析第二个参数源缓冲区src是否来自于外部输入如网络recv、命令行参数argv或文件读取fread若源数据来自外部不可信来源且目标为固定大小栈缓冲区则将告警级别提升为CRITICAL (可直接利用栈溢出)。2. 批量无头模式Headless Analysis集成在大型安全团队中可利用 IDA 的无头运行模式idat64 -A -Sscript.py target_binary将该 IDAPython 审计脚本嵌入到企业 DevSecOps 固件漏洞扫描流水线中实现全天候自动化漏洞挖掘。
返回列表