Go语言逆向技术:常量字符串
摘要: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语言字符串的切割在二进制安全检测中可以真实的还原源代码中引用字符串的信息,提升检测准确率。
可以试试下面的漏扫服务,看看系统是否存在安全风险:>>>漏洞扫描服务
Go语言逆向技术:常量字符串的更多相关文章
- c语言字符数组与字符串的使用详解
转自:http://www.jb51.net/article/37456.htm 1.字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素.char str[10]={ ...
- Swift语言指南(一)--语言基础之常量和变量
原文:Swift语言指南(一)--语言基础之常量和变量 Swift 是开发 iOS 及 OS X 应用的一门新编程语言,然而,它的开发体验与 C 或 Objective-C 有很多相似之处. Swif ...
- 【C语言】-指针和字符串
本文目录 字符串回顾 一.用指针遍历字符串的所有字符 二.用指针直接指向字符串 三.指针处理字符串的注意 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速 ...
- 关于C语言打印string类字符串的问题
首先因为printf函数输出字符串是针对char *的,即printf只能输出c语言的内置数据,而string不是c语言的内置数据. 其次string类型的对象不止包含字符串,还包含了许多用于操作的函 ...
- C语言相关的基础字符串函数
C语言中没有专门的字符串类型,所以就用字符数组和字符指针形式表示 1 char arr[]="abcdef"; //字符数组表示的字符串 2 char*arr="abce ...
- C语言学习笔记---3.字符串格式化输入输出
1.C语言字符串 字符串(character string)是一个或多个字符的序列,例如:"Zing went the strings of my heart!" C语言没有专门用 ...
- 逍遥自在学C语言 | 变量、常量与数据类型
前言 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.基本数据类型 1.整型 C语言中的整型数据如下表所示: ...
- iOS开发系列--C语言之数组和字符串
概览 数组在C语言中有着特殊的地位,它有很多特性,例如它的存储是连续的,数组的名称就是数组的地址等.而在C语言中是没有String类型的,那么如果要表示一个字符串,就必须使用字符数组.今天主要就介绍如 ...
- 11-C语言指针&一维数组&字符串
一.用指针遍历数组元素 1.最普通的遍历方式是用数组下标来遍历元素 1 // 定义一个int类型的数组 2 int a[4] = {1, 2, 3, 4}; 3 4 int i; 5 for (i = ...
- Swift3.0语言教程使用URL字符串
Swift3.0语言教程使用URL字符串 Swift3.0语言教程使用URL字符串,和路径一样,URL其实也是字符串,我们可以将这些字符串称为URL字符串.本小节将讲解URL字符串的使用. 1.编码 ...
随机推荐
- CF B. Gardener and the Array
B. Gardener and the Array 思路:只要找到一个c他的每一位均在除了它的集合中出现过即可 这题T了2发,用来multiset,注意multiset大的时间复杂度是O(K + lo ...
- 线性dp数字三角形
数字三角形是最裸的题目,没有加入任何的背景,这里就不写了. 下面这道摘花生的题目就是数字三角形的应用 Hello Kitty想摘点花生送给她喜欢的米老鼠. 她来到一片有网格状道路的矩形花生地(如下图) ...
- 子组件emit 父组件方法,成功后回调执行子组件方法
场景: 父组件 update方法 子组件 确定按钮 getlist 刷新列表 子组件点击确定按钮,调用父组件新增接口,新增成功以后,子组件列表刷新 子组件: emit("confirmPa ...
- 将.View.dll文件反编译出来的*Views*.cs文件转换成.cshtml
先使用反编译工具将.View.dll文件反编译放入文件夹,然后将文件夹整体复制进\src\viewcs2cshtml\viewcs2cshtml\bin\Debug\net6.0\viewcs 复制完 ...
- tomcat nio2源码分析
一. 前言 最近在看tomcat connector组件的相关源码,对Nio2的异步回调过程颇有兴趣,平时读源码不读,自己读的时候很多流程都没搞明白,去查网上相关解析讲的给我感觉也不是特别清晰,于 ...
- this.$router 与this.$route的区别
this.$router是Vue-Router的实例,需要导航到不同路由则用this.$router.push方法 this.$route为当前路由的跳转对象,包含当前路由的name.path.que ...
- Jdk_HashMap 源码 —— hash(Object)
Jdk 源码 HashMap 的源码是在面试中考的算是比较多的,其中有很多高性能的经典写法,也值得多学习学习. 本文是本人在阅读和学习源码的过程中的笔记(不是教程),如有错误欢迎指正. Jdk Ver ...
- 如何用MySQL快速导入sql数据?
在 MySQL 中,可以使用多种方法来快速导入 SQL 数据.以下是一些常用的方法和技巧,以帮助你在 MySQL 中快速导入大量的 SQL 数据. 1. 使用 mysql 命令行工具 - 将 SQL ...
- ElasticSearch索引生命周期策略配置(ES TTL)
背景 有些索引数据作为临时数据存放,一段时间后我们希望索引可以自动过期删除,就是常说的TTL(Time To Live)机制 ElasticSearch索引数量过多会占用很多主分片和副本分片,最终导致 ...
- 开发必备工具、插件【ME】
工欲善其事,必先利其器,记录自己开发中常用的工具.插件: 慢慢更新... 一.必备 1.Visual Studio.IntelliJ IDEA .Sublime Text 3 2.TeamViewe ...