avatar

Catalog
初探Go逆向

适用场景

分析无壳、无混淆、纯Go编译的二进制程序

准备工作

静态分析思路(IDA辅助)

关键字

  • Query:

    • 用途:服务端的Web程序,通常具有查询数据库的功能,若源码未进行混淆,常会暴露出关键字 “Query”
    • 获取方式:通过搜索关键字 “Query + 特定标识” (例如QueryAccount,QueryDatabase,QueryId)定位潜在的数据库查询函数,分析其伪代码,以还原数据的存储和查询过程
  • Salt:

    • 用途:数据入库时进行加盐哈希,从而降低被撞库的风险

    • 常见获取方式:

      • 一种是已经初始化好,位于.data段中,通过搜索字符串 “Salt” 进行定位

      • 另一种是尚未初始化,在.data段中存在一串字符串或某个常数,程序会按照设定算法随机从字符串中取出单个字符进行拼接,形成盐;或者将字符串中的每个字符转换为整型,依次对常数进行加减运算,得到新的数值后再根据ascii码转换回对应的字符,并拼接成字符串,形成最终的盐。

        实战中,盐的生成方案需要根据实际情况确定,通常盐会出现在调用哈希函数前处理数据的部分,因此可先确定加密用的哈希函数,再回溯调用该哈希函数的上层函数,再对该上层函数进行分析

    • 可能的用法:

      • 将需要入库的数据与盐进行拼接,对拼接后的数据进行哈希运算
      • 盐作为加密密钥,再进行哈希运算将数据加密

伪代码

Go函数的鉴别

在执行了go程序分析脚本后,大部分函数均可解析出来,只需F5一键查看伪代码就可以。需要注意的是,这里解析出的函数通常是原生go函数的底层实现,虽然也是go写的,但是命名通常有所不同,来看下面的例子:

这个Demo进行了一些简单的字符串拼接、替换、分割的操作,并对字符串进行加盐哈希,这里主要关注红框框住的操作。接下来看看IDA中解析出来的伪代码:

可以看到解析出的伪代码,是go函数的底层实现,这部分底层实现的函数名,可以在对go程序进行调试时,从汇编中看到:

这些go函数的底层实现与其本身有着类似的函数名,从这个角度入手,即可猜到实际调用的go函数。

部分情况下,IDA解析不正确时,仍需要结合汇编进行判断,通常在创建一个slice时会使用make进行空间的分配,例如make([]string, 0, 5),其中0代表当前slice的长度,5代表slice的容量,也就是最大长度。在本例中,只进行了字符串的拼接,而slice的拼接通常使用append函数在尾部附加,由于IDA会将append操作进行优化,实际显示出的是直接进行下标赋值:

也因此,在一些较为复杂的情况下,有些slice对append的操作,会被解析成slice.cap = 'xxxx',此时IDA直接解析出了slice的cap属性,却将字符串以赋值的操作,赋给了cap属性。此时就要进一步查看汇编,分析给slice赋值的处的地址与前一个元素的地址是否连续来判断这个操作是否为字符串的拼接。更多的细节需要了解写屏障相关概念,这里不深究。

第三方库

通常,在经过脚本解析后,可以比较清晰的看到

github_com_gin_gonic_gin_RouterGroup_Handle

补充

4月12日,看雪论坛的一篇精华文章,详细介绍了在经过IDA脚本解析后的Go代码,该如何去分析其数据结构。当初,我就想写这么一篇文章,可惜没有这个时间和耐心去钻研。现在,有了这篇文章,就不需要我再去详细写了。因此这里,直接就附上了他文章的地址。以后复习到这里的时候,一定需要再把他的这篇文章看一看,复习复习!

参考链接

  1. Github:Go程序分析脚本
  2. golang 中 strings 包的 Replace 用法介绍
  3. 看雪:Go解析
Author: cataLoc
Link: http://cata1oc.github.io/2019/02/17/%E5%88%9D%E6%8E%A2Go%E9%80%86%E5%90%91/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
    微信
  • 支付寶
    支付寶