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语言;
go语言逆向技术之---恢复函数名称算法
文章图片
特性2:在没有符号表的情况下如何恢复函数名称 。
我们知道在C/C++编译出来的二进制文件中 , 如果没有符号表信息是没法看到函数名称的 , 在IDA工具中只能看到地址信息 。
go语言逆向技术之---恢复函数名称算法
文章图片
go语言怎么来恢复函数名称呢 , 可以通过从.data.rel.ro节来恢复函数名 , 具体查找定位算法如下:
go语言逆向技术之---恢复函数名称算法
文章图片
方法1:
解析解头信息可以获取magic,quantum,ptr_size,func_tab_count数据 , 当magic为’xfbxffxffxff’时 , entry_size=2*ptr_size为entry结构体大小 , func_tab_count为entry结构体数量;解析entry结构获取到名称信息结构数据位置偏移(需要注意64位和32位go程序func_info_offset位置相反) , 读取名称信息结构体数据 , 再从中获取到名称字符串位置偏移(name_offset) , 根据此偏移定位到函数名称字符串起始位置偏移 , 从该位置解析得到函数名称 。
方法2:
另外1.16版本go语言结构有些新变化 , magic变为’xfaxffxffxff’ , 解析头信息获取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=’xfbxffxffxff’一致 。
总结:
通过上述方法可以恢复函数真实名称 , 从而方便对go语言二进制文件的逆向分析 , 提升分析效率 。 返回搜狐 , 查看更多
go语言逆向技术之---恢复函数名称算法】责任编辑: