【摘要】go語言編譯出來的二進(jìn)制文件中,字符串?dāng)?shù)據(jù)是如何存放的,逆向時(shí)如何快速和準(zhǔn)確的識(shí)別出源代碼中定義的字符串,本文給你解密。
Go語言源代碼編譯成二進(jìn)制文件后,源代碼中的字符串存放在哪里?是如何組織的?
以下面go語言源代碼為例:package mainimport “fmt”func main() {fmt.Println(“Hello, World!”)}
雖然只是打印一個(gè)字符串"Hello, World!",生成的二進(jìn)制文件中字符串卻是非常的多:
Go語言二進(jìn)制文件中字符串是存放在哪里的呢?其實(shí)存放的位置遵循的elf格式原則,在.rodata節(jié)中(如上圖所示)。
有同學(xué)會(huì)問C語言編譯出來的elf格式中字符串也是這樣存放的,Go語言的字符串組織方法和C語言的字符串組織方法有什么不同的呢?最大的不同點(diǎn)就是C語言字符串是以’\x00’結(jié)尾的,這樣不同字符串之間可以方便的以’\x00’來切割,而Go語言的字符串你可以發(fā)現(xiàn)是沒有’\x00’結(jié)尾的,比如上圖中"Hello, World!"后面緊接著就是"SIGKILL:"了,沒有’\x00’分隔。
Go語言字符串按以下方法來組織:
● 字符串按長(zhǎng)度從小到大排列
● 相同長(zhǎng)度的字符串按字符比較的方法從小到大排列
● 非可見字符串先轉(zhuǎn)義再存放
另外Go語言字符串一般從go_string位置開始存放,如下圖所示
逆向時(shí)正確切割Go語言字符串方法有兩種:
● 進(jìn)行反匯編,解析匯編指令,確定字符串起始位置和處理長(zhǎng)度

● 直接根據(jù)Go語言字符串組織原則進(jìn)行切割
基于Go語言字符串組織原則的快速切割算法:
● 1、 搜索確定go_string起始位置
● 2、 設(shè)置字符串搜索起始長(zhǎng)度為1
● 3、 根據(jù)當(dāng)前字符串長(zhǎng)度切割字符串
● 4、 預(yù)切割下一個(gè)字符串,和當(dāng)前字符串進(jìn)行比較,檢查是否違反原則,若符合保存當(dāng)前字符串,繼續(xù)第3步切割下一個(gè)字符串,否則表示字符串有變化進(jìn)行第5步操作
● 5、 把當(dāng)前字符串長(zhǎng)度加1,繼續(xù)第3步的搜索,直至全部正確搜索完畢
如下圖所示(長(zhǎng)度為13個(gè)字節(jié)的字符串):
【總結(jié)】go語言字符串的切割在二進(jìn)制安全檢測(cè)中可以真實(shí)的還原源代碼中引用字符串的信息,提升檢測(cè)準(zhǔn)確率。
可以試試下面的漏掃服務(wù),看看系統(tǒng)是否存在安全風(fēng)險(xiǎn):>>> 漏洞掃描服務(wù)
- GaussDB開發(fā)_GaussDB數(shù)據(jù)庫開發(fā)_高斯數(shù)據(jù)庫開發(fā)_華為云
- 數(shù)據(jù)治理中心_數(shù)據(jù)架構(gòu)_數(shù)據(jù)架構(gòu)使用示例-華為云
- 時(shí)序數(shù)據(jù)庫_GeminiDB Influx 接口場(chǎng)景_免費(fèi)_數(shù)據(jù)庫資源_實(shí)時(shí)數(shù)據(jù)庫和時(shí)序數(shù)據(jù)庫
- 實(shí)時(shí)語音識(shí)別_錄音文件識(shí)別_語言生成
- 數(shù)據(jù)治理中心_數(shù)據(jù)集成_使用教程_-華為云
最新文章
- Gauss(DWS)數(shù)據(jù)加解密_數(shù)據(jù)加解密算法_數(shù)據(jù)加解密函數(shù)
- GaussDB函數(shù)_GaussDB數(shù)據(jù)庫函數(shù)_高斯數(shù)據(jù)庫函數(shù)_華為云
- GaussDB支持的函數(shù)_GaussDB函數(shù)類型解析_高斯數(shù)據(jù)庫支持的函數(shù)-華為云
- Go鏡像下載
- GaussDB查版本命令_GaussDB命令參考_高斯數(shù)據(jù)庫查版本命令-華為云
- 免費(fèi)數(shù)據(jù)庫mogodb_文檔數(shù)據(jù)庫增強(qiáng)版_GeminiDB Mongo接口_兼容MongoDB