首页 > 编程语言 >go语言逆向技术之---恢复函数名称算法

go语言逆向技术之---恢复函数名称算法

时间:2022-10-12 20:47:43浏览次数:66  
标签:逆向 off 语言 xff --- 名称 func 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语言二进制文件的逆向分析,提升分析效率。

 

标签:逆向,off,语言,xff,---,名称,func,go
From: https://www.cnblogs.com/z123455/p/16785874.html

相关文章

  • tidb-binlog 测试使用
    1、编辑配置文件[root@mysql-4~]#catscale-out-binlog.yamlpump_servers:-host:172.16.1.12drainer_servers:-host:172.16.1.12config:syncer.db-typ......
  • Asible最佳实践-进阶版-RHCA447 定义分组与变量
     Asible最佳实践-进阶版-RHCA447-------定义角组变量/主机变量/变量文件 6.1所有受管节点设置sudo免密   [root@libinlibin]#vim/etc/sudoers.d/devop......
  • 宝塔安装FTP服务器Pure-Ftpd不能读取目录列表的解决方法
    宝塔面板安装了FTP服务器Pure-Ftpd1.0.49后,远程登陆FTP可以登陆成功,但是发现目录无法读取列表出来,这种情况大都出现在被动端口或远程服务器发回了不可用的路由地址所致。......
  • CSP-S模拟18
    先放个代码,等改完T3再写思路代码#include<bits/stdc++.h>#definereregister#definelllonglong#defineullunsignedlonglongusingnamespacestd;inlinei......
  • CVE-2022-22965漏洞分析
    ASpringMVCorSpringWebFluxapplicationrunningonJDK9+maybevulnerabletoremotecodeexecution(RCE)viadatabinding.Thespecificexploitrequires......
  • go语言逆向技术之---常量字符串解密
    Go语言源代码编译成二进制文件后,源代码中的字符串存放在哪里?是如何组织的?以下面go语言源代码为例:packagemainimport“fmt”funcmain(){fmt.Println(“Hello,Worl......
  • patch-package给npm包打补丁
    需要修改npm依赖包,可以借助patch-package修改并保留对npm依赖项的修改。1.安装patch-packagenpmpatch-package--save-dev2.修改npm包3.生成补丁npxpatch-package......
  • BAPI_GOODSMVT_CREATE物料凭证创建…
    'BAPI_GOODSMVT_CREATE可以实现物料凭证创建和部分冲销全部冲销可以使用BAPI_GOODSMVT_CANCELFUNCTION 'BAPI_GOODSMVT_CREATE'        EXPORTING     ......
  • idea项目文件夹浅黄色编写代码无提示或看不到项目中的文件夹 找到项目下的.idea文件
    idea项目文件夹浅黄色编写代码无提示或看不到项目中的文件夹JetBrainside全家桶ide都可能出现此情况,项目文件左上角选择为项目时不展示src等包/文件夹,只有选择Projec......
  • 滴水-文件读写 开源代码
    #include<stdio.h>#include<malloc.h>#include<string.h>//此处是禁用函数警报#define_CRT_SECURE_NO_DEPRECATE#pragmawarning(disable:4996)FILE*openFile(......