[安全工具][原创]保存IDA Pro中生成的函数调用关系(图)
保存IDA Pro中生成的函数调用关系(图)
【未经同意禁止转载】
鉴于本博客涉及的信息安全技术具有破坏计算机信息系统的风险,建议读者在学习/研究/探讨之前,确保已经充分了解以下内容:
本博客所讨论的技术仅限于研究和学习,旨在提高计算机信息系统的安全性,严禁用于不良动机,任何个人/团队/组织不得将其用于非法目的,否则后果自负,特此声明。
“在手里拿着锤子的人眼里,全世界都是钉子。”
在研究西门子PLC CPU固件逆向的工作中[1],我非常想搞搞清楚函数之间的调用关系,以此达到按图索骥的目的。同时fix掉看雪论坛上这个远古的问题[2]。
举个例子,如下代码所示,当我明确FUN_001b8eb6_sys_send
函数仅被FUN_001ba9fc
函数调用。换言之,当一个s7comm的PDU组包完成后,接下来必然会调用FUN_001ba9fc
函数以实现发包的目的。
void FUN_001ba9fc(ushort *puParm1,int iParm2)
{
//省略无关代码
if (*(char *)(puParm1 + 0x12) == 0x0) {
iVar4 = FUN_001b8eb6_sys_send(*puVar5,(uint)*(ushort *)(iParm2 + 10) + *(int *)(iParm2 + 0x10),local_18,1);//int t_send(long s, char *buf, int len, int flags)
那么,组包函数必然和FUN_001ba9fc
发包函数必然在某个函数内形成先后顺序,该函数先调用组包函数,再调用发包函数,如以下伪代码表示。
void FUN_xxxx(ushort *puParm1,int iParm2)
{
//...
pdu_create_funciton();//PDU组包完成后
FUN_001ba9fc();
//...
}
因此,我有必要考察某组包函数和发包函数之间的距离【在一个有向(可能)有环图中!】。
要解决这个问题,最好将全局函数调用关系生成一个文字可搜索的PDF文件,这样函数名是可搜索的,函数调用关系是用有向图形象表示的。
Step1 使用IDA Pro生成函数调用关系
点击IDA Pro->View->graphs->function calls,或者快捷键是Ctrl+F12,如下图所示。
Step2 保存wingraph中生成的函数调用关系为GDL。
在Windows+IDA Pro下查看Step1中生成的由WinGraph展示的图,点击file->save as,将该调用关系另存为GDL(graph discription language)文本为test.gdl
,如下图所示。
Step3 使用easy-graph将GDL描述文件转换成DOT描述文件
在LINUX/UBUNTU下 shell下安装easy-graph(前提是已经安装GraphViz)
sudo cpan Graph:Easy # 安装 Graph Easy,可能会要求更新cpan mirror的源
在LINUX/UBUNTU下输入shell命令[3]
graph-easy --input=test.gdl --as_dot -o test.dot
Step4 在LINUX/UBUNTU下生成pdf
dot -Tpdf test.dot -o test.pdf
Step5 结束
提示:依据我的经验,在超大规模函数的逆向工程中,不建议使用全局的函数调用图(function calls graph)。因为这会让你得到全局信息,而忽视掉局部信息。要知道,千里之堤,溃于蚁穴。依据灰盒的经验,定位到一个你感兴趣的函数,再以拼图的方式联系到其他函数,可能是安全研究的常用套路。
我手上under test的西门子PLC CPU模块属于早期的S7-1200系列(十分抱歉,我不能公开该设备的订货号、固件版本等指纹信息),它既支持s7comm协议,也支持s7comm-plus协议;因为产品硬件版本和固件版本太低,极大概率不支持s7comm-plus-plus协议。我使用IDA Pro和Ghidra等工具反汇编/反编译了该设备的固件。 ↩︎
posted on 2020-04-12 09:50 大单GreatDane 阅读(2666) 评论(1) 编辑 收藏 举报