IDA 如何恢复strip后binary的符号信息

如何恢复strip之后的binary符号信息仍然是一个学术界研究的项目。因为给定源代码,不同的编译器/优化选项/CPU支持的指令集/目标架构 都会对变异过后的二进制文件产生影响。而且有些没有被引用的静态包并不会被引入二进制文件里面。所以这仍旧是一个难以解决的问题。

FLAIR

Pros: 官方支持,使用简单

Cons: 仅支持静态系统库,如libc等。仅支持函数签名,且需要手动解决conflict

FLAIR已经被官方支持了,如果你下载的是7.7版本的话,就会有FLAIR套件,没有的话网上也有一大堆如何安装FLAIR的东西。

https://github.com/mandiant/flare-ida

但是函数签名并不是万能的,因为strip过后的库函数有很多相同的函数签名,

RIZZO

基于二进制bytes的比较,同时也支持上面的FLAIR所有功能,支持Call Graph + 常数搜索 + 函数签名,看上去是个不错的选项。

函数签名容易撞车,Call Graph 容易被function inline干掉,Constant Search能够快速搜索,但是如果二进制函数没有啥常数,那就寄了,而且一些优化器也能够做到常数级别的优化,比如说优化div 3 成一堆魔数的。

https://github.com/grayhatacademy/ida/tree/master/plugins/rizzo

Bindiff

基于二进制的比较,效果比Rizzo更好。缺点是面对跨优化选项/跨指令集 的支持比较差。可以和IDA Pro 无缝衔接,也支持cli命令行/