ITPub博客

首页 > 大数据 > 数据挖掘 > go语言逆向技术之---常量字符串解密

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

投稿 数据挖掘 作者:科技说i 时间:2022-10-12 19:54:24 0 删除 编辑

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个字节的字符串):

 


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70022888/viewspace-2918095/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2022-10-11

  • 博文量
    40
  • 访问量
    13133