摘要:在对程序做安全审计、漏洞检测时,通常都需要对程序做逆向分析,本文在没有符号表的情况下,提出了一种恢复函数名称的算法,方便对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语言二进制文件的逆向分析,提升分析效率。

可以试试下面的漏扫服务,看看系统是否存在安全风险:>>>漏洞扫描服务

点击关注,第一时间了解华为云新鲜技术~

Go语言逆向技术:恢复函数名称算法相关推荐

  1. 二进制SCA指纹提取黑科技:Go语言逆向技术

    摘要:SCA(Software Composition Analysis)软件成分分析,指通过对软件源码.二进制软件包等的静态分析,挖掘其所存在的开源合规.已知漏洞等安全合规风险,是一种业界常见的安全 ...

  2. Go语言逆向技术:常量字符串

    摘要:Go语言源代码编译成二进制文件后,源代码中的字符串存放在哪里?是如何组织的? 本文分享自华为云社区<go语言逆向技术之---常量字符串解密>,作者:安全技术猿. Go语言源代码编译成 ...

  3. go语言逆向技术之---常量字符串解密

    [摘要]go语言编译出来的二进制文件中,字符串数据是如何存放的,逆向时如何快速和准确的识别出源代码中定义的字符串,本文给你解密. **Go语言源代码编译成二进制文件后,源代码中的字符串存放在哪里?是如 ...

  4. C/C++函数名称修饰规则及extern C的作用(函数名压扎)

    一.函数名称修饰规则 函数的名字修饰(Decorated Name)就是编译器在编译期间创建的一个字符串,用来指明函数的定义或原型.LINK程序或其他工具有时需要指定函数的名字修饰来定位函数的正确位置 ...

  5. 【Android 逆向】Dalvik 函数抽取加壳 ( Dalvik 下的函数指令抽取与恢复 | dex 函数指令恢复时机点 | 类加载流程 : 加载、链接、初始化 )

    文章目录 前言 一.Dalvik 下的函数指令抽取与恢复 二.dex 函数指令恢复时机点 1.dex 函数指令恢复 2.Android 源码中搜索 dexFindClass 函数 3.类加载流程 : ...

  6. R语言dplyr包mutate_at函数通过名称修改指定数据列的内容(使用统一的函数)实战

    R语言dplyr包mutate_at函数通过名称修改指定数据列的内容(使用统一的函数)实战 目录 R语言dplyr包mutate_at函数通过名称修改指

  7. c语言算法6,c语言6函数和算法.ppt

    c语言6函数和算法创新 近半个月目标 学会使用函数进行模块化程序设计 学会调试由多个函数(包含库函数)组成的程序 主要内容 模块化程序设计思想 函数定义和函数调用.函数原型(函数声明) 函数的参数和返 ...

  8. R语言dplyr包summarise_at函数计算dataframe数据中多个数据列(通过向量指定)的计数个数、均值和中位数、使用list函数指定函数列表并指定自定义函数名称

    R语言dplyr包summarise_at函数计算dataframe数据中多个数据列(通过向量指定)的计数个数.均值和中位数.使用list函数指定函数列表并指定自定义函数名称 目录

  9. c语言计算时间的编程,C语言实现时间戳转日期的算法(推荐)

    1.算法 时间是有周期规律的,4年一个周期(平年.平年.平年.闰年)共计1461天.Windows上C库函数time(NULL)返回的是从1970年1月1日以来的毫秒数,我们最后算出来的年数一定要加上 ...

最新文章

  1. New Video Game Controlled By Kissing
  2. Android性能优化——内存泄漏优化
  3. C++中的野指针问题
  4. 学习Python中用numpy与matplotlib遇到的一些数学函数与函数的绘图
  5. U-Boot之代码调试
  6. dubbo服务的运行方式
  7. 扎金花 游戏开发细节与部分代码
  8. 媒体播放控件的引入 0131
  9. 联发科天玑800适配鸿蒙系统,联发科天玑800什么水平
  10. UML学习笔记(一):UML简介
  11. linux 每日学一点《将LINUX变成路由器》
  12. MCSA Windows Server 2016 Complete Study Guide, 2nd Edition 免积分下载
  13. PLC不用编程,以太网方式与多台智能仪表、变频器等串口设备通讯(基于智能网关)
  14. 冲压模具是冲压生产必不可少的工艺装备
  15. 【办公必备软件】万彩办公大师教程丨PDF转HTML工具
  16. 根据经纬度坐标获得省市区县行政区划城市名称,自建数据库 java python php c# .net 均适用
  17. Matlab之函数参数nargin和nargout
  18. 使用nexus私服下载和上传依赖
  19. 操作系统形式化验证实践教程(7) - C代码的自动验证(转载)
  20. fastadmin的详细安装过程

热门文章

  1. raspberry pi_探索Raspberry Pi Sense HAT
  2. JavaScript实现元素全排列
  3. java中常见的编译错误的是_编译时JAVA最常见的错误有哪些
  4. mysql oracle 锁机制_Mysql锁机制
  5. c语言文件归并问题_通知:土地有变!土地归并:每亩补9万?明年起:合村并镇!能否启动?1个好消息!...
  6. 二等水准数据平差_二等水准复测平差成果表
  7. python画图x轴丢值_python-从pyplot绘图中擦除先前绘制的内容
  8. php服务器估算,使用zabbix API估算服务器磁盘空间可用天数
  9. pymavlink 源码剖析(一)之XML文件的数据解析
  10. Luogu P2055 [ZJOI2009]假期的宿舍