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语言逆向技术:常量字符串相关推荐
- 二进制SCA指纹提取黑科技:Go语言逆向技术
摘要:SCA(Software Composition Analysis)软件成分分析,指通过对软件源码.二进制软件包等的静态分析,挖掘其所存在的开源合规.已知漏洞等安全合规风险,是一种业界常见的安全 ...
- Go语言逆向技术:恢复函数名称算法
摘要:在对程序做安全审计.漏洞检测时,通常都需要对程序做逆向分析,本文在没有符号表的情况下,提出了一种恢复函数名称的算法,方便对go语言二进制文件进行逆向分析,提升分析效率. 本文分享自华为云社区&l ...
- 【C语言】sizeof常量字符串
常量字符串的常用表示方式: 1.常量自身:如:"abc" 2.将常量存放到数组:如:char []a = "abc" 3.用字符指针指向常量字符串:如:cons ...
- go语言逆向技术之---常量字符串解密
[摘要]go语言编译出来的二进制文件中,字符串数据是如何存放的,逆向时如何快速和准确的识别出源代码中定义的字符串,本文给你解密. **Go语言源代码编译成二进制文件后,源代码中的字符串存放在哪里?是如 ...
- 第4关:字符串中各类字符数的统计-------C语言程序设计技术(循环结构程序设计1)
第4关:字符串中各类字符数的统计-------C语言程序设计技术(循环结构程序设计1) #include<stdio.h>int main(void){ /*********Begin** ...
- C语言中可以用字符串常量来,C语言字符串详解
原标题:C语言字符串详解 字符串是一种非常重要的数据类型,但是C语言不存在显式的字符串类型,C语言中的字符串都以字符串常量的形式出现或存储在字符数组中.同时,C 语言提供了一系列库函数来对操作字符串, ...
- C语言中可以用字符串常量来,C语言中的字符串常量
C语言中的字符串常量 字符串常量是由一对双引号括起的字符序列.例如: "CHINA" ,"C program: , "$12.5" 等都是合法的字符串 ...
- 【C 语言】字符串 一级指针 内存模型 ( 指定大小字符数组 | 未指定大小字符数组 | 指向常量字符串的指针 | 指向堆内存的指针 )
文章目录 一.字符串 一级指针 内存模型 1.指定大小字符数组 2.未指定大小字符数组 3.指向常量字符串的指针 4.指向堆内存的指针 一.字符串 一级指针 内存模型 #include <std ...
- C语言字符数组与字符串的使用及加结束符‘\0‘的问题
1.字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素. char str[10]={ 'I',' ','a','m',' ','h','a','p','p','y ...
最新文章
- 【每日一算法】二叉搜索树结点最小距离
- 干货丨AI语音二三事:你需要了解这些AI 语音对话技术
- VS2010重构学习总结
- 习题3.8 符号配对 (20分)
- debug跳出循环_Java基础-第04章:循环结构「云图智联」
- windows 两条命令快速关闭 445等危险端口
- 前端知识天天学(2)
- 新增一个主键自增长_第17期:索引设计(主键设计)
- 深入解析字符串的比较方法:“==”操作符;String.Equals方法;String.Compare方法;String.CompareOrdinal方法。...
- 【nodejs学习】0.nodejs学习第一天
- 为什么公司宁愿花 15k 重招一个新人,也不愿加薪 5k 留住老程序员?
- Quorum简介部署
- imx6ull 14*14 平台使用mfgtools下载代码出现UTP Waiting for device to appear错误
- 海淘、跨境电商国际物流对接那些坑
- MOOC武汉大学SAS第2章作业
- python运行启动报错解决方法_pyspider启动错误解决(Python 3.7)
- Linux实战技巧--文件系统操作(二)--创建和删除目录(mkdir/rm)
- nm linux 输出含义,nm 命令输出项解析
- 怎样把c语言软件卸载干净,系统软件怎样操作才能彻底卸载删除干净软件程序...
- 园林宣传片文案撰写方法
热门文章
- eddystone_超级计算机上的Linux,Google的Eddystone和更多新闻
- 如何在开源社区贡献代码_在社区支持大量涌现之后,Biicode便开始开源
- Linux游戏蒸蒸日上,Wikimedia坚持开放格式,等等
- (47)fs创建多级目录
- es6 Iterator(迭代器)的概念
- CAN笔记(2) CAN特点
- xcode 工程没有模拟器_Xcode只允许我运行iOS设备(没有模拟器)
- autohold有什么弊端吗_自动驻车AUTO HOLD有啥作用?怎样使用?
- 077 Combinations 组合
- 支付宝及时到账(新版)配置