日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
利用Ghidra逆向分析Go二進(jìn)制程序(下篇)

動(dòng)態(tài)分配字符串結(jié)構(gòu)

創(chuàng)新互聯(lián)專(zhuān)注為客戶(hù)提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站制作、網(wǎng)站建設(shè)、峽江網(wǎng)絡(luò)推廣、成都微信小程序、峽江網(wǎng)絡(luò)營(yíng)銷(xiāo)、峽江企業(yè)策劃、峽江品牌公關(guān)、搜索引擎seo、人物專(zhuān)訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供峽江建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com

在第一種情況下,字符串結(jié)構(gòu)是在運(yùn)行時(shí)創(chuàng)建的,為此,需要使用一系列匯編指令在字符串操作之前設(shè)置相應(yīng)的結(jié)構(gòu)。由于指令集的不同,不同的架構(gòu)之間的結(jié)構(gòu)也是不同的。讓我們通過(guò)幾個(gè)案例,來(lái)展示我們的腳本(find_dynamic_strings.py)尋找的指令序列。

x86架構(gòu)下字符串結(jié)構(gòu)的動(dòng)態(tài)分配

首先,我們先來(lái)看看“Hello Hacktivity”這個(gè)例子。

 圖20 hello_go中字符串結(jié)構(gòu)的動(dòng)態(tài)分配情況

 圖21 hello_go中未定義的“hello, hacktivity”字符串

運(yùn)行腳本后,代碼是這樣的:

 圖22 執(zhí)行find_dynamic_strings.py后,hello_go中動(dòng)態(tài)分配的字符串結(jié)構(gòu)

可以看到,該字符串已經(jīng)被定義:

 圖23 hello_go中已經(jīng)定義了“hello hacktivity”字符串

同時(shí),字符串“hacktivity”也可以在Ghidra的Defined Strings視圖中找到。

 圖24 通過(guò)"hacktivity"過(guò)濾在hello_go中已定義的字符串

實(shí)驗(yàn)證明,我們的腳本能夠在32位和64位x86二進(jìn)制文件中尋找以下指令序列:

 圖25 eCh0raix字符串結(jié)構(gòu)的動(dòng)態(tài)分配

 圖26 hello_go中動(dòng)態(tài)分配的字符串結(jié)構(gòu)

ARM架構(gòu)下字符串的動(dòng)態(tài)分配

對(duì)于32位ARM架構(gòu),我們將以eCh0raix勒索軟件樣本為例來(lái)說(shuō)明字符串的恢復(fù)方法。

 圖27 eCh0raix中字符串結(jié)構(gòu)的動(dòng)態(tài)分配

 圖28 eCh0raix中指向字符串地址的指針

 圖29 eCh0raix中未定義的字符串

執(zhí)行腳本后,代碼將變成下面的樣子:

 圖30 執(zhí)行find_dynamic_strings.py后,eCh0raix中動(dòng)態(tài)分配字符串結(jié)構(gòu)

我們可以看到,指針已經(jīng)被重新命名,并定義了字符串:

 圖31 執(zhí)行find_dynamic_strings.py后,eCh0raix中指向字符串地址的指針

 圖32 執(zhí)行find_dynamic_strings.py后,eCh0raix中定義的字符串

該腳本在32位ARM二進(jìn)制文件中查找可以下指令序列:

對(duì)于64位ARM架構(gòu),我們將通過(guò)一個(gè)Kaiji樣本來(lái)演示字符串的恢復(fù)方法。在這里,代碼使用了兩個(gè)指令序列,但是只在一個(gè)序列中發(fā)生了變化:

 圖33 Kaiji中字符串結(jié)構(gòu)的動(dòng)態(tài)分配

執(zhí)行腳本后,代碼將變?yōu)椋?/p>

 圖34 執(zhí)行find_dynamic_strings.py后,Kaiji中字符串結(jié)構(gòu)的動(dòng)態(tài)分配情況

我們可以看到,這些字符串已經(jīng)被定義:

 圖35 執(zhí)行find_dynamic_strings.py后,Kaiji中定義的字符串

該腳本能夠在64位ARM二進(jìn)制文件中找到以下指令序列:

 如您所見(jiàn),該腳本可以恢復(fù)動(dòng)態(tài)分配的字符串結(jié)構(gòu)。這非常有助于逆向工程師閱讀匯編代碼,或在Ghidra中的Defined String視圖中尋找可疑的字符串。

這種方法所面臨的挑戰(zhàn)

這種方法最大的缺點(diǎn)是,每種架構(gòu)(甚至同一架構(gòu)內(nèi)的不同解決方案)都需要在腳本中添加一個(gè)新的分支。而且,規(guī)避這些預(yù)定義的指令集是很容易的。在下面的例子中,對(duì)于Kaiji 64位ARM惡意軟件樣本來(lái)說(shuō),由于字符串的長(zhǎng)度被移到了一個(gè)寄存器中,而腳本卻沒(méi)有預(yù)料到這一點(diǎn),因此會(huì)漏掉這個(gè)字符串。

 圖36 Kaiji以不尋常的方式動(dòng)態(tài)分配字符串結(jié)構(gòu)

 圖37 Kaiji中一個(gè)未定義的字符串

靜態(tài)分配字符串結(jié)構(gòu)

在接下來(lái)的這個(gè)案例中,我們的腳本(find_static_strings.py)用于查找靜態(tài)分配的字符串結(jié)構(gòu)。這意味著字符串指針后面是字符串長(zhǎng)度。

這就是x86 eCh0raix勒索軟件樣本中找到的字符串指針及其長(zhǎng)度:

 圖38 eCh0raix中靜態(tài)分配的字符串結(jié)構(gòu)

在上圖中,字符串指針后面是字符串長(zhǎng)度值,然而,Ghidra無(wú)法區(qū)分地址和整數(shù)數(shù)據(jù)類(lèi)型,但是代碼中直接引用的第一個(gè)指針除外。

 圖39 eCh0raix中的字符串指針

未定義的字符串可以通過(guò)字符串地址找到:

 圖40 eCh0raix中未定義的字符串

執(zhí)行該腳本后,將定義字符串地址、字符串長(zhǎng)度值和字符串本身:

 圖41 執(zhí)行find_static_strings.py后,eCh0raix中靜態(tài)分配的字符串結(jié)構(gòu)

 圖42 執(zhí)行find_static_strings.py后,eCh0raix中定義的字符串

挑戰(zhàn):消除誤報(bào)和字符串遺漏

我們希望消除誤報(bào),為此,我們需要:

  •  限制字符串的長(zhǎng)度
  •  搜索可打印字符
  •  在二進(jìn)制文件的數(shù)據(jù)段進(jìn)行搜索

很明顯,由于這些限制,字符串很容易成為漏網(wǎng)之魚(yú)。如果你使用這個(gè)腳本,請(qǐng)隨意試驗(yàn):不停改變這些值,以找到最佳設(shè)置。其中,以下代碼用于限制長(zhǎng)度和字符集:

 圖43 find_static_strings.py.

 圖44 find_static_strings.py

字符串恢復(fù)所面臨的進(jìn)一步挑戰(zhàn)

Ghidra的自動(dòng)分析可能會(huì)錯(cuò)誤地識(shí)別某些數(shù)據(jù)類(lèi)型。如果發(fā)生這種情況,我們的腳本將無(wú)法在該特定位置創(chuàng)建正確的數(shù)據(jù)。為了解決這個(gè)問(wèn)題,必須先刪除不正確的數(shù)據(jù)類(lèi)型,然后才能創(chuàng)建新的數(shù)據(jù)類(lèi)型。

例如,先我們來(lái)看看eCh0riax勒索軟件中靜態(tài)分配的字符串結(jié)構(gòu)。

 圖45 eCh0raix中靜態(tài)分配的字符串結(jié)構(gòu)

在這里,地址的識(shí)別是正確的,但是,字符串長(zhǎng)度值(應(yīng)該是整數(shù)數(shù)據(jù)類(lèi)型)被錯(cuò)誤地識(shí)別為未定義的值。

在我們的腳本中,以下幾行代碼用于刪除不正確的數(shù)據(jù)類(lèi)型:

 圖46 find_static_strings.py

執(zhí)行該腳本后,不僅所有的數(shù)據(jù)類(lèi)型都被正確識(shí)別出來(lái)了,而且所有字符串也被定義了:

 圖47 執(zhí)行find_static_strings.py后,eCh0raix中字符串結(jié)構(gòu)的靜態(tài)分配情況

另一個(gè)問(wèn)題來(lái)自于這樣一個(gè)事實(shí):在Go二進(jìn)制文件中,字符串將被串聯(lián)并存儲(chǔ)到一個(gè)大的字符串blob中。在某些情況下,Ghidra會(huì)將整個(gè)blob定義為單個(gè)字符串。這些可以通過(guò)大量的offcut引用來(lái)識(shí)別。Offcut引用是對(duì)已定義字符串的某些部分的引用,不是對(duì)字符串起始地址的引用——注意,它是對(duì)字符串內(nèi)部的某個(gè)位置的引用。

下面的內(nèi)容來(lái)自ARM Kaiji樣本:

 圖48 Ghidra錯(cuò)誤定義的字符串

 圖49 Kaiji對(duì)錯(cuò)誤定義的字符串的offcut引用

要找到錯(cuò)誤定義的字符串,可以使用Ghidra中的Defined Strings窗口,按照offcut引用數(shù)對(duì)字符串進(jìn)行排序。在執(zhí)行字符串恢復(fù)腳本之前,可以手動(dòng)取消對(duì)具有大量offcut引用的大型字符串的定義。這樣,腳本就可以成功地創(chuàng)建正確的字符串?dāng)?shù)據(jù)類(lèi)型。

 圖50 Kaiji中定義的字符串

一旦通過(guò)手動(dòng)方式或通過(guò)我們的腳本成功定義了一個(gè)字符串,它就能夠在Ghidra的列表視圖中正確的顯示出來(lái),從而幫助逆向工程師順利閱讀匯編代碼。但是,Ghidra中的反編譯器視圖無(wú)法正確處理固定長(zhǎng)度的字符串,并且,無(wú)論字符串的長(zhǎng)度如何,它都會(huì)顯示所有內(nèi)容,直到找到空字符為止。幸運(yùn)的是,這個(gè)問(wèn)題將在Ghidra(9.2)的下一個(gè)版本中得到解決。

下面,我們以eCh0raix樣本為例來(lái)說(shuō)明這個(gè)軟件問(wèn)題:

 圖51 eCh0raix顯示在Listing視圖中的已定義字符串

 圖52 eCh0raix顯示在Decompile視圖中的已定義字符串

小結(jié)

本文重點(diǎn)探討了逆向分析Go二進(jìn)制文件時(shí)所面臨的兩個(gè)難題的解決方法,以幫助逆向工程師使用Ghidra對(duì)使用Go編寫(xiě)的惡意軟件進(jìn)行靜態(tài)分析。具體來(lái)說(shuō),我們首先討論了如何恢復(fù)剝離型Go二進(jìn)制文件中的函數(shù)名,并提出了幾種在Ghidra中定義字符串的解決方案。我們創(chuàng)建的腳本和本文中的例子所使用的文件都是公開(kāi)的,大家可以通過(guò)下面的鏈接找到它們。

實(shí)際上,這只是在Go二進(jìn)制程序的逆向之旅中邁出的一小步。接下來(lái),我們計(jì)劃深入研究Go函數(shù)的調(diào)用約定和類(lèi)型系統(tǒng)。

在Go二進(jìn)制代碼中,參數(shù)和返回值是通過(guò)棧而不是寄存器傳遞給函數(shù)的,而Ghidra目前很難正確檢測(cè)到這些內(nèi)容。因此,幫助Ghidra支持Go的調(diào)用約定將有助于逆向工程師理解所分析的函數(shù)的用途。

另一個(gè)有趣的話題是Go二進(jìn)制文件中的類(lèi)型。正如我們從被調(diào)查的文件中提取函數(shù)名稱(chēng)所顯示的那樣,Go二進(jìn)制文件也存儲(chǔ)有關(guān)所用類(lèi)型的信息?;謴?fù)這些類(lèi)型對(duì)逆向工程有很大的幫助。在下面的例子中,我們恢復(fù)了一個(gè)eCh0raix勒索軟件樣本中的main.Info結(jié)構(gòu)體。這個(gè)結(jié)構(gòu)體能夠告訴我們,惡意軟件希望從C2服務(wù)器得到哪些信息。

 圖53 eCh0raix中的main.info結(jié)構(gòu)體

 圖54 eCh0raix中的main.info字段

 圖55 eCh0raix中的main.info結(jié)構(gòu)體

正如你所看到的,從逆向工程的角度來(lái)看,在Go二進(jìn)制代碼中還有很多有趣的地方有待考察,對(duì)此感興趣的讀者,請(qǐng)關(guān)注我們的下一篇文章。

保存本文中所用腳本和其他材料的Github倉(cāng)庫(kù)的地址如下所示:

  •  https://github.com/getCUJO/ThreatIntel/tree/master/Scripts/Ghidra
  •  https://github.com/getCUJO/ThreatIntel/tree/master/Research_materials/Golang_reversing

本文所使用的相關(guān)文件:

File name SHA-256

[1] hello.c ab84ee5bcc6507d870fdbb6597bed13f858bbe322dc566522723fd8669a6d073

[2] hello.go 2f6f6b83179a239c5ed63cccf5082d0336b9a86ed93dcf0e03634c8e1ba8389b

[3] hello_c efe3a095cea591fe9f36b6dd8f67bd8e043c92678f479582f61aabf5428e4fc4

[4] hello_c_strip 95bca2d8795243af30c3c00922240d85385ee2c6e161d242ec37fa986b423726

[5] hello_go 4d18f9824fe6c1ce28f93af6d12bdb290633905a34678009505d216bf744ecb3

[6] hello_go_strip 45a338dfddf59b3fd229ddd5822bc44e0d4a036f570b7eaa8a32958222af2be2

[7] hello_go.exe 5ab9ab9ca2abf03199516285b4fc81e2884342211bf0b88b7684f87e61538c4d

[8] hello_go_strip.exe ca487812de31a5b74b3e43f399cb58d6bd6d8c422a4009788f22ed4bd4fd936c

[9] eCh0raix – x86 154dea7cace3d58c0ceccb5a3b8d7e0347674a0e76daffa9fa53578c036d9357

[10] eCh0raix – ARM 3d7ebe73319a3435293838296fbb86c2e920fd0ccc9169285cc2c4d7fa3f120d

[11] Kaiji – x86_64 f4a64ab3ffc0b4a94fd07a55565f24915b7a1aaec58454df5e47d8f8a2eec22a

[12] Kaiji – ARM 3e68118ad46b9eb64063b259fca5f6682c5c2cb18fd9a4e7d97969226b2e6fb4

參考資料

  • https://rednaga.io/2016/09/21/reversing_go_binaries_like_a_pro/
  •  https://2016.zeronights.ru/wp-content/uploads/2016/12/GO_Zaytsev.pdf
  •  https://carvesystems.com/news/reverse-engineering-go-binaries-using-radare-2-and-python/
  •  https://www.pnfsoftware.com/blog/analyzing-golang-executables/
  • https://github.com/strazzere/golang_loader_assist/blob/master/Bsides-GO-Forth-And-Reverse.pdf
  • https://github.com/radareorg/r2con2020/blob/master/day2/r2_Gophers-· AnalysisOfGoBinariesWithRadare2.pdf

相關(guān)工具

IDA Pro

  •  https://github.com/sibears/IDAGolangHelper
  •  https://github.com/strazzere/golang_loader_assist

radare2/Cutter

  •  https://github.com/f0rki/r2-go-helpers
  •  https://github.com/JacobPimental/r2-gohelper/blob/master/golang_helper.py
  •  https://github.com/CarveSystems/gostringsr2

Binary Ninja

  •  https://github.com/f0rki/bn-goloader

Ghidra

  •  https://github.com/felberj/gotools
  •  https://github.com/ghidraninja/ghidra_scripts/blob/master/golang_renamer.py

 

本文翻譯自:https://cujo.com/reverse-engineering-go-binaries-with-ghidra如若轉(zhuǎn)載,請(qǐng)注明原文地址。


文章名稱(chēng):利用Ghidra逆向分析Go二進(jìn)制程序(下篇)
標(biāo)題URL:http://www.5511xx.com/article/dhjhopi.html