再谈逆向工程中的函数识别

逆向工程中一般使用bindiff等工具进行二进制比较,常用来进行windows补丁分析,也可以用来函数识别。

分析一个被strip过的,不包含调试信息和符号信息的ELF,最难地莫过于怎样确定库函数了。常用的函数识别技术主要牵涉2类:一是IDA自身的FLIRT技术,二是rizzo技术。

1、FLIRT技术

FLIRT是”Fast Library Identification and Recognition Technology”的缩写。这是IDA自带的一种函数识别技术。它为静态库中每个函数确定其特征字节流、特定调用关系、特定检查项等等,以此识别出对应函数。将各函数名及其识别特征按特定格式组织并存放在签名文件中,形成扩展名为.sig的签名文件。IDA在分析ELF时,可以加载.sig,自动识别ELF中静态链接进来的库函数。

定制签名文件的一般流程是:

ELF->PAT->SIG

windows下为myLib.lib制作sig文件的一个示例:

pcf.exe myLib.lib myLib.pat

sigmake.exe myLib.pat myLib.sig

Linux下为静态库libc.a制作sig的示例如下

pelf libc.a libc.pat

sigmake libc.pat libc.sig

上述pcf.exe, sigmake.exe、pelf等为FLAIR工具集里的工具。FLAIR可在IDA SDK中获取。

2、rizzo

rizzio是另一套启发式函数识别标准,它检查函数对特征字符串的引用、对特征常量的引用、CFG等。这些检查项受编译器、编译选项、源代码版本影响较小。

rizzo的工作流程是:

IDB A -> RIZ -> IDB B

rizzo.py是IDA插件,将之复制到plugins目录,重启IDA即可。

https://github.com/fireundubh/IDA7-Rizzo

上述版本的rizzo可应用到IDA 7.0。

导出.riz:

File -> Produce file -> Rizzo signature file

加载.riz:

File -> Load file -> Rizzo signature file

下面仍然以看雪·安恒2020KCTF春季赛第2题 子鼠开天(https://ctf.pediy.com/game-season_fight-136.htm)来说明函数识别的步骤

(1)查看程序的编译器信息

程序采用VC6.0编译。

另外,如果程序为linux下的elf文件,则可以用readelf查看.comment段

譬如,上述format程序采用GCC 5.4.0编译,运行在Ubuntu 5.4.0-6或Ubuntu 16.04.11系统下。

(2)查找字符串,确定开源库的源代码版本

从网上下载OpenSSL 0.9.8zh版本的源码

https://github.com/openssl/openssl/archive/OpenSSL_0_9_8zh.zip

结合第(1)步的结论,用VC6.0将其编译为dll文件,最终生成libeay32.dll、ssleay32.dll。

IDA打开这些dll文件,发现libeay32.dll才是加密函数的主体部分,ssleay32.dll不过是SSL相关的函数,因此之后我们只会用libeay32.dll。

(3)为libeay32.dll导出sigature文件,假设文件名为openssl.riz

File -> Produce file -> Rizzo signature file

(4)IDA 7.0打开keygenme_1,应用openssl.riz

File -> Load file -> Rizzo signature file

最后output窗口会显示如下信息

正式识别了80个函数,晦涩难懂的sub_ 401210的识别效果如下

是不是跟阅读自己写的代码一样,兴奋吧?

虽然rizzo号称受编译器、编译选项、源代码版本影响较小,实际上影响还是挺大的。为了验证,我将上述openssl 0.9.8zh源码用VS 2008编译一次,根据VS 2008生成的dll文件生成rizzo签名文件,应用时output窗口显示的信息如下

这次正式识别了12个函数,sub_ 401210的识别效果如下

核心函数都没有识别出来。因此确定编译器版本、源代码版本对于函数识别影响很大。

现在再说说用FLIRT识别这个程序的情况:

将openssl 0.9.8zh用VC6编译为libeay32.lib、ssleay32.lib,分别用pcf.exe、sigmake.exe生成模式文件和签名文件,应用签名时,结果却是

白忙一场,没有任何效果

总结: rizzo的函数识别效果比FLIRT的效果要好,如果用FLIRT的签名文件没有识别出函数千万别放弃,兴许rizzo能让你柳暗花明又一村。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,183评论 6 516
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,850评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,766评论 0 361
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,854评论 1 299
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,871评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,457评论 1 311
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,999评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,914评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,465评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,543评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,675评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,354评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,029评论 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,514评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,616评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,091评论 3 378
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,685评论 2 360