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

本文介绍了Go语言编译后的二进制文件中字符串的存储位置和组织方式,与C语言的区别,并提供了两种逆向时正确切割Go语言字符串的方法,包括基于Go字符串组织原则的快速切割算法,对于二进制安全检测有重要意义。
摘要由CSDN通过智能技术生成

【摘要】go语言编译出来的二进制文件中,字符串数据是如何存放的,逆向时如何快速和准确的识别出源代码中定义的字符串,本文给你解密。

**Go语言源代码编译成二进制文件后,源代码中的字符串存放在哪里?是如何组织的?**

以下面go语言源代码为例:\
package main\
import “fmt”\
func main() {\
fmt.Println(“Hello, World!”)\
}

虽然只是打印一个字符串"Hello, World!",生成的二进制文件中字符串却是非常的多:\
![image.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/dbd8142cfc6f41329b1968821ec8777a~tplv-k3u1fbpfcp-zoom-1.image)

Go语言二进制文件中字符串是存放在哪里的呢?其实存放的位置遵循的elf格式原则,在.rodata节中(**如上图所示**)。

有同学会问C语言编译出来的elf格式中字符串也是这样存放的,Go语言的字符串组织方法和C语言的字符串组织方法有什么不同的呢?最大的不同点就是C语言字符串是以’\x00’结尾的,这样不同字符串之间可以方便的以’\x00’来切割,而Go语言的字符串你可以发现是没有’\x00’结尾的,比如上图中"Hello, World!"后面紧接着就是"SIGKILL:"了,没有’\x00’分隔。

**Go语言字符串按以下方法来组织:**

-   字符串按长度从小到大排列
-   相同长度的字符串按字符比较的方法从小到大排列
-   非可见字符串先转义再存放

另外Go语言字符串一般从**go_str

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值