Go语言逆向技术:常量字符串
2023-02-18 15:36:29 时间
摘要:Go语言源代码编译成二进制文件后,源代码中的字符串存放在哪里?是如何组织的?
本文分享自华为云社区《go语言逆向技术之---常量字符串解密》,作者:安全技术猿。
Go语言源代码编译成二进制文件后,源代码中的字符串存放在哪里?是如何组织的?
以下面go语言源代码为例:
package main import “fmt” func main() { fmt.Println(“Hello, World!”) }
虽然只是打印一个字符串"Hello, World!",生成的二进制文件中字符串却是非常的多:
Go语言二进制文件中字符串是存放在哪里的呢?其实存放的位置遵循的elf格式原则,在.rodata节中(如上图所示)。
有同学会问C语言编译出来的elf格式中字符串也是这样存放的,Go语言的字符串组织方法和C语言的字符串组织方法有什么不同的呢?最大的不同点就是C语言字符串是以’\x00’结尾的,这样不同字符串之间可以方便的以’\x00’来切割,而Go语言的字符串你可以发现是没有’\x00’结尾的,比如上图中"Hello, World!"后面紧接着就是"SIGKILL:"了,没有’\x00’分隔。
Go语言字符串按以下方法来组织:
- 字符串按长度从小到大排列
- 相同长度的字符串按字符比较的方法从小到大排列
- 非可见字符串先转义再存放
另外Go语言字符串一般从go_string位置开始存放,如下图所示
逆向时正确切割Go语言字符串方法有两种:
- 进行反汇编,解析汇编指令,确定字符串起始位置和处理长度
- 直接根据Go语言字符串组织原则进行切割
基于Go语言字符串组织原则的快速切割算法:
- 1、 搜索确定go_string起始位置
- 2、 设置字符串搜索起始长度为1
- 3、 根据当前字符串长度切割字符串
- 4、 预切割下一个字符串,和当前字符串进行比较,检查是否违反原则,若符合保存当前字符串,继续第3步切割下一个字符串,否则表示字符串有变化进行第5步操作
- 5、 把当前字符串长度加1,继续第3步的搜索,直至全部正确搜索完毕
如下图所示(长度为13个字节的字符串):
总结:
go语言字符串的切割在二进制安全检测中可以真实的还原源代码中引用字符串的信息,提升检测准确率。
可以试试下面的漏扫服务,看看系统是否存在安全风险:>>>漏洞扫描服务
相关文章
- golang go-sql-driver gorm 数据库报错 bad connection
- linux 命令之 ls 命令详解
- git help 查看命令手册
- 【6】python生成数据曲线平滑处理——(Savitzky-Golay 滤波器、convolve滑动平均滤波)方法介绍,推荐玩强化学习的小伙伴收藏
- 数据挖掘机器学习[四]---汽车交易价格预测详细版本{嵌入式特征选择(XGBoots,LightGBM),模型调参(贪心、网格、贝叶斯调参)}
- 像go 一样 打造.NET 单文件应用程序的编译器项目bflat 发布 7.0版本
- 解决idea登录github出现的invalid authentication data 404 not found以及登录 token 失效
- 虹科方案|将以太网连接添加到Dell EMC PowerVault™ ML3 SAS库
- Linux运维常用shell脚本之系统管理实例
- Linux运维常用shell脚本之网络管理实例
- Java线程与Linux内核线程的映射关系
- PowerDesigner连接mysql逆向生成pdm
- oracle学习笔记(十六) PL/SQL 异常和goto语句
- gitlab使用培训
- 【完全开源】知乎日报UWP版(下篇):商店APP、github源码、功能说明。Windows APP 良心出品。
- The Similarities and Differences Between C# and Java -- Part 1(译)
- Django Admin实现三级联动(省市区)
- Linux运维工程师工作手册
- Linux系统初始化
- Linux三剑客之awk命令详解及相关实例