IDA二进制逆向函数识别与符号表还原的方法 2020-04-15 07:39:25 Steven Xeldax ## 目录 - 基于签名文件的符号表还原 - FLIRT - RIZZO - Lscan - Syms2ELF - 基于BinDiff的符号表还原 - Zynamic Bindiif - Diaphora > 在逆向的过程中常常会碰到没有符号表的二进制,不管是strip的还是IOT固件如果纯靠字符串和逻辑一个个去重命名函数就会花费很多时间。一般而言对还原符号表的方法主要有两种,一种是利用签名数据库,另外就是利用BinDiif二进制比对来还原符号表。 ## 基于签名文件的符号表还原 ### FLIRT FLIRT自带的签名文件 在IDA安装根目录下有个sig的文件夹,里面放着一些常见的自带签名文件。  应用FLIRT签名文件 View->Open subviews->Signatures(Shift-F5)  View->Open subviews->Signatures(Shift-F5)->右键菜单->Apply new signature(Ins)  之后就能看到在sig下面默认的一些签名可以直接放进来加载  下面看下如何生成我们前面所说的签名文件,这个需要一套IDA自带的flairx.x的工具集,如下图所示,默认是放在ida的安装根目录下。  需要注意的是FLIRT的签名识别方案只能提取静态编译库的符号表,所以无法针对可执行二进制文件本身。 首先看下FLIRT工具集生成SIG的流程: .a通过pelf生成PAT PAT通过sigmake生成得到sig  pelf  sigmake  生成的libutils.sig就是我们已经能够使用的签名文件,我们只需要将该文件复制到sig目录中就可以了  复制到具体哪个目录根据架构而来。例如我们将libutils.sig复制到arm文件夹中,那么当我们逆向arm系列的固件时候就可以导入在该文件夹下的sig文件,如下:  FLRIT允许我们自己生成好用的签名库,也可以使用开源社区大家公布的数据库: ``` https://github.com/Maktm/FLIRTDB https://github.com/push0ebp/sig-database ``` FLRIT如果遇到不是静态库怎么办,如果目标是IOT的固件显然pelf就无法工作,IDB2PAT这个工具很好的解决了这个问题。它通过IDA生成的IDB数据库,在IDB数据库上做转换生成了PAT文件。 https://raw.githubusercontent.com/fireeye/flare-ida/master/python/flare/idb2pat.py 这个工具是个IDA的py插件,只需要复制到python文件夹里然后在ida中加载script就可以。 用法: 将python脚本复制到下述位置:  然后在IDA中alt-F7载入脚本  之后提示pat保存路径,导出即可。  ### RIZZO FLIRT的函数识别特征主要是机器码序列,而静态库函数的机器码序列受编译器、编译选项、源代码版本影响太大。Craig提出另一套启发式函数识别标准 rizzo的工作流程是: IDB A -> RIZ -> IDB B rizzo安装方法: https://raw.githubusercontent.com/fireundubh/IDA7-Rizzo/master/rizzo.py rizzo.py是IDA插件,将之复制到plugins目录,重启IDA即可。  使用 参考二进制生成函数签名  对无符号的二进制目标载入刚才生成的二进制尝试还原  如果成功还原的会生成一系列的蓝色函数  ### Lscan 假设我们分析的二进制或者说固件没有之前历史版本或者参考的二进制,那么可以使用Lscan通过大量搜索多个sig文件来确定固件或者二进制用了哪些第三方依赖。 ``` root@kali:~/Tools/Binary/lscan# python lscan.py -h Usage: lscan.py [options] Options: -h, --help show this help message and exit -v, --versbose Verbose mode -s SIGFILE, --sig=SIGFILE Signature file -S SIGDIR, --sigs=SIGDIR Signature folder -f BINFILE, --file=BINFILE ELF file -d, --dump Dump signature filre ``` ### Syms2Elf https://raw.githubusercontent.com/danigargu/syms2elf/master/syms2elf.py 复制到plugins目录下然后重新运行ida就可以加载该插件了  ``` Signatures applied in 37.99 seconds [syms2elf] Exporting symbols to ELF... [syms2elf] ELF saved to: F:\1.elf ```  ## 基于BinDiff的符号表还原 ### Zynamic Bindiif Bindiff安装过程见google Bindiff依赖IDB数据库,所以在对比之前需要生成对应的IDB数据库信息。 Diff之后的效果:  然后右键可以导入比对的符号表,可以全选也可以选择自己认为需要的目标  ### Diaphora 安装相对Bindiif比较简单,直接下载 https://github.com/joxeankoret/diaphora ALT-F7加载diaphora.py就可以 生成两个二进制的sqlite数据库以后再进行比较就可以   ## 参考资料 https://xz.aliyun.com/t/4484 https://bbs.pediy.com/thread-217790.htm http://blog.nsfocus.net/function-recognition-reverse-engineering-iot-equipment/