Sec

网络安全研究员,专注于工业互联网安全领域。求职中。

导航

[安全工具][原创]保存IDA Pro中生成的函数调用关系(图)

保存IDA Pro中生成的函数调用关系(图)

mailto:wangkai0351@gmail.com

【未经同意禁止转载】

鉴于本博客涉及的信息安全技术具有破坏计算机信息系统的风险,建议读者在学习/研究/探讨之前,确保已经充分了解以下内容:

本博客所讨论的技术仅限于研究和学习,旨在提高计算机信息系统的安全性,严禁用于不良动机,任何个人/团队/组织不得将其用于非法目的,否则后果自负,特此声明。

“在手里拿着锤子的人眼里,全世界都是钉子。”

在研究西门子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)。因为这会让你得到全局信息,而忽视掉局部信息。要知道,千里之堤,溃于蚁穴。依据灰盒的经验,定位到一个你感兴趣的函数,再以拼图的方式联系到其他函数,可能是安全研究的常用套路。


  1. 我手上under test的西门子PLC CPU模块属于早期的S7-1200系列(十分抱歉,我不能公开该设备的订货号、固件版本等指纹信息),它既支持s7comm协议,也支持s7comm-plus协议;因为产品硬件版本和固件版本太低,极大概率不支持s7comm-plus-plus协议。我使用IDA Pro和Ghidra等工具反汇编/反编译了该设备的固件。 ↩︎

  2. https://bbs.pediy.com/thread-171243.htm ↩︎

  3. .http://www.voidcn.com/article/p-cwvwrajs-bge.html ↩︎

posted on 2020-04-12 09:50  大单GreatDane  阅读(2375)  评论(1编辑  收藏  举报