zoukankan      html  css  js  c++  java
  • [安全工具][原创]保存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 ↩︎

  • 相关阅读:
    Redis应用----消息传递
    Memcache存储机制与指令汇总
    文本挖掘预处理之向量化与Hash Trick
    证书(Certificate)与描述文件(Provisioning Profiles)
    IOS使用命令行打包
    IOS使用xcode编译代码
    IOS使用SourceTree
    docker修改docker0 mtu
    linux开机自启动
    设计模式
  • 原文地址:https://www.cnblogs.com/bianmu-dadan/p/12683820.html
Copyright © 2011-2022 走看看