目录

Golang逆向思考

在前段时间对xray进行逆向过程中,发现golang编译的程序会有巨多函数,不能说都是多余的,但是大部分函数的确不是用户编写的代码生成的,而是golang运行时和各种库所需要的东西

同时,因为去除了符号表,这些大量的非实际业务代码会对我们逆向工作造成极大困难,如果能够利用一些自动化工具重建符号表或者重新命名,就可以极大的便利我们逆向

golang特殊段

在本次逆向的过程中,我遇到了上述的问题,在网上搜索发现了一个ida插件, IDAGolangHelper

这个插件的作者对golang编译器有深入的研究,他发现golang编译器在linux平台下交叉编译windows平台下运行的程序时,会生成一个特殊的段.gopclntab,在这个段中会保存一份特殊的符号表,作者利用这个段的信息对符号表进行了重建,我在使用过程中发现效果不错

但是该方法的使用是由限制条件的,如果没有这个段的信息就完全无法使用这个工具了

基于同源性

golang编译生成的程序中大部分函数都是golang运行时函数和一些库函数

运行时函数与golang版本、运行平台和操作系统有关,感觉也会与是否采用交叉编译有关系,我没有深入研究

而库函数分为官方库和第三方库两种,官方库是golang官方维护的基本函数库,大家用的都是相同的,第三方库大家用的实际上也是比较集中,golang生态还不是非常完善,好用的库就那么多

基于以上的特点,我们可以考虑使用同源性分析的方法

预先的工作

在逆向之前,我们需要进行预先的准备

首先需要使用不同版本、不同平台的golang编译器对go运行时函数、基本库函数、知名第三方库函数等代码针对不同目标平台、目标系统进行编译,生成二进制程序,然后对二进制的函数提取特征,建立函数的特征库

特征匹配

在逆向的时候,我们就可以先分析程序的golang版本、编译平台、运行平台,然后使用相对应的特征库对去除了符号表的二进制函数进行特征匹配,通过这种方法可以对大部分基本的函数重建符号表,而剩余的小量函数便可以确定为用户编写的代码,需要我们深入分析

这个工作应该已经有人开始做了