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语言字符串的切割在二进制安全检测中可以真实的还原源代码中引用字符串的信息,提升检测准确率。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Go语言中的字符 在Go语言中,没有字符类型,字符类型是rune类型,rune是int32的别称。 下面用一个简单...
    gowk阅读 8,485评论 0 4
  • unicode字符基础知识了解 Unicode的基础是一个有编号的字符集,在字符集之上又规定了模块化的编码等等技术...
    caoxinyiyi阅读 3,926评论 0 1
  • 获取字符串长度 已知字符串在Go语言中的本质是一个切片,如果想获得切片的长度,可以通过len()函数获取 所以可以...
    超级皮波9阅读 5,312评论 0 1
  • 字符串 字符串长度 获取字符串长度字符串在Go语言中的本质是一个切片, 如果想要获取切片的长度, 可以通过len(...
    喝酸奶要舔盖__阅读 3,921评论 0 0
  • 背景介绍 在我们实际开发过程中,不可避免的要进行一些字符串的拼接工作。比如将一个数组按照一定的标点符号拼接成一个句...
    JankinHou阅读 4,005评论 0 0

友情链接更多精彩内容