Go语言逆向技术:恢复函数名称算法
摘要:在对程序做安全审计、漏洞检测时,通常都需要对程序做逆向分析,本文在没有符号表的情况下,提出了一种恢复函数名称的算法,方便对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语言二进制文件的逆向分析,提升分析效率。
可以试试下面的漏扫服务,看看系统是否存在安全风险:>>>漏洞扫描服务
相关文章
- C++中的const究竟有什么好处呢?(必须干货)
- DNS服务器搭建(Linux版本)
- algorithm中的排序算法详解
- 我的go+初体验——大一从c++到go+的快速上手
- 蓝桥杯2020c++B组省赛
- Power BI 基于门店位置的产品销售排行
- Power BI基于门店位置的业绩达成表现
- Power BI模拟麦肯锡客流转化漏斗图
- Linux系列(31) - rpm命令管理之升级与卸载命令(3)
- Linux系列(30) - rpm命令管理之安装命令(2)
- Linux系列(29) - rpm包命名规则(1)
- Linux系列(28) - 软件包简介
- Linux系列(27) - 三剑客grep、awk、sed
- Linux系列(26) - 强制杀死进程
- Linux系列(25) - 常用快捷键(未更新完)
- 说说Golang goroutine并发那些事儿
- Linux系列(24) - chmod
- Linux系列(23) - echo
- Linux系列(22) - 用户登录查看命令
- Linux系列(21) - 光盘、U盘挂载