go 语言逆向技术之 --- 恢复函数名称算法
【摘要】 在对程序做安全审计、漏洞检测时,通常都需要对程序做逆向分析,本文在没有符号表的情况下,提出了一种恢复函数名称的算法,方便对 go 语言二进制文件进行逆向分析,提升分析效率。
go 语言是最近几年发展非常火的一种语言,它具备和 C/C++一样的运行速度快的优点,同时又具备开发效率高,支持包管理机制高阶语言特点。其编译出来的二进制文件格式和 C/C++一样运行在 Linux 平台下是 elf 格式,运行在 windows 平台下是 pe 格式,但同时在二进制文件的内部细节上 go 语言有自己特有的属性,二进制逆向人员可以利用 go 语言这些特有属性来来实现对二进制文件进行更精准的逆向分析。
特性 1:利用 go 语言中特有的节信息来判断 elf/pe 文件的源代码语言类型,是 go 语言还是 C、c++语言。
通过判断二进制文件中是否存在“.noptrdata”、“.gopclntab”、“.data.rel.ro.gopclntab”确定源代码,如果存在上述节名称,则源代码为 go 语言;
特性 2:在没有符号表的情况下如何恢复函数名称。
我们知道在 C/C++编译出来的二进制文件中,如果没有符号表信息是没法看到函数名称的,在 IDA 工具中只能看到地址信息。
go 语言怎么来恢复函数名称呢,可以通过从.data.rel.ro 节来恢复函数名,具体查找定位算法如下:
方法 1:解析解头信息可以获取 magic, quantum, ptr_size, func_tab_count 数据,当 magic 为’\xfb\xff\xff\xff’时,entry_size = 2 * ptr_size 为 entry 结构体大小,func_tab_count 为 entry 结构体数量;解析 entry 结构获取到名称信息结构数据位置偏移(需要注意 64 位和 32 位 go 程序 func_info_offset 位置相反),读取名称信息结构体数据,再从中获取到名称字符串位置偏移(name_offset),根据此偏移定位到函数名称字符串起始位置偏移,从该位置解析得到函数名称。
方法 2:另外 1.16 版本 go 语言结构有些新变化,magic 变为’\xfa\xff\xff\xff’,解析头信息获取 func_tab_cnt, file_cnt, func_name_off, cu_off, filetab_off, pctab_off, func_tab_off 数据,其中 func_tab_off 为 entry 数据起始位置,解析 entry 结构获取 code_off, func_info_offset 数据,后续解析过程与 magic=’\xfb\xff\xff\xff’一致。
总结:通过上述方法可以恢复函数真实名称,从而方便对 go 语言二进制文件的逆向分析,提升分析效率。
作者:热爱永不降温
链接:https://juejin.cn/post/7138035393634500622
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论