跟羽夏學(xué) Ghidra ——引用
寫在前面
??此系列是本人一個字一個字碼出來的,包括示例和實驗截圖。本人非計算機(jī)專業(yè),可能對本教程涉及的事物沒有了解的足夠深入,如有錯誤,歡迎批評指正。 如有好的建議,歡迎反饋。碼字不易,如果本篇文章有幫助你的,如有閑錢,可以打賞支持我的創(chuàng)作。如想轉(zhuǎn)載,請把我的轉(zhuǎn)載信息附在文章后面,并聲明我的個人信息和本人博客地址即可,但必須事先通知我。
你如果是從中間插過來看的,請仔細(xì)閱讀 跟羽夏學(xué) Ghidra ——簡述 ,方便學(xué)習(xí)本教程。請認(rèn)準(zhǔn) 博客園 的 寂靜的羽夏 ,目前僅在該平臺發(fā)布。
前言
??雖然標(biāo)題起的是“引用”,但不會僅僅講這個。我們將會涉及函數(shù)、交叉引用相關(guān)的知識。話不多說,下面開始。
交叉引用
??先講最簡單的:交叉引用。我們經(jīng)常在Ghidra看到有這樣的注釋:
************************************************
* FUNCTION *
************************************************
undefined variable()
undefined AL:1 <RETURN>
tstruct Stack[-0x18]:16 lstruct XREF[1,3]:00401185(W),
00401189(W),
0040118f(W),
00401196(W)
variable XREF[4]: Entry Point(*),
main:0040137c(c),
00402238, 00402318(*)
00401162 55 PUSH RBP
??其中XREF就是所謂的交叉引用。如果你在某個函數(shù)中調(diào)用了其他函數(shù),或者引用了其他數(shù)據(jù),這都屬于交叉引用的范圍。好,寂靜的羽夏講完了這,下面輪到函數(shù)。
函數(shù)
??函數(shù),是一個十分簡單又十分復(fù)雜又十分重要的東西。從匯編層面,函數(shù)就是一個重復(fù)使用的一個匯編代碼片段,可以傳參,完成功能,也可以返回一個值作為結(jié)果。
??在逆向過程中,我們有時候遇到過這樣的問題,比如一串代碼被識別為數(shù)據(jù)(ShellCode 會經(jīng)常遇到),我們轉(zhuǎn)化為代碼之后,我們還需要將其轉(zhuǎn)為函數(shù),方便分析:
??點擊之后,我們就可以創(chuàng)建一個函數(shù)。
??在分析一個函數(shù)的功能之后,我們會習(xí)慣加個注釋,以后的時候方便繼續(xù)或者回顧,Ghidra有添加注釋的功能,熱鍵是;,一個英文狀態(tài)的分號。注釋有五種,下面介紹一下:
EOL Comments:這個也許是最常用的注釋類型是行結(jié)束EOL注釋,它位于列表窗口中現(xiàn)有行的末尾。若要添加注釋,請使用分號喚出對話框,并選擇EOL Comments選項卡。默認(rèn)情況下,EOL注釋顯示為藍(lán)色文本,如果在“注釋”文本框中輸入多行,則將跨越多行。每一行都將縮進(jìn),以便在反匯編的右側(cè)對齊,現(xiàn)有內(nèi)容將向下移動,以便為新注釋留出空間。您可以通過重新打開對話框隨時編輯注釋。刪除注釋的最快方法是單擊列表窗口中的注釋,然后按Delete鍵。Ghidra本身在自動分析期間添加了許多EOL注釋。只有在擁有與特定數(shù)據(jù)類型相關(guān)聯(lián)的信息時才能這樣做。這些信息通常包含在類型庫中,這些類型庫顯示在數(shù)據(jù)類型管理器窗口中。
Pre/Post Comments:預(yù)注釋Pre Comments和后注釋Post Comments是在給定反匯編行之前或之后出現(xiàn)的完整行注釋。將鼠標(biāo)懸停在截斷的注釋上,將顯示完整的注釋。默認(rèn)情況下,預(yù)注釋顯示為紫色,后注釋顯示為藍(lán)色,以便輕松地將它們與列表中的正確地址關(guān)聯(lián)。
Plate Comments:它允許您對注釋進(jìn)行分組,以便在列表窗口中的任何位置顯示。該注釋居中并放置在以星號為界的矩形內(nèi)。我們檢查過的許多清單都包括一個簡單的板注釋Plate Comments,在邊界框中包含單詞函數(shù)。當(dāng)在所選函數(shù)中的第一個地址打開注釋對話框時,你可以選擇用您自己的、信息更豐富的注釋替換此通用板注釋。除了替換默認(rèn)板注釋之外,Ghidra還將注釋添加為反編譯器窗口頂部。如果創(chuàng)建Plate Comments時光標(biāo)位于反編譯器窗口的頂部,結(jié)果將是相同的。
Repeatable Comments:可重復(fù)注釋輸入一次,但在整個反匯編過程中可能會自動出現(xiàn)在許多位置??芍貜?fù)注釋的行為與交叉引用的概念有關(guān)?;旧?,在交叉引用的目標(biāo)輸入的可重復(fù)評論在交叉引用源處得到回應(yīng)。因此,單個可重復(fù)注釋可能會在反匯編中的多個位置得到響應(yīng)(因為交叉引用可以是多對一)。在反匯編列表中,可重復(fù)注釋的默認(rèn)顏色為橙色,回應(yīng)注釋為灰色,使其易于與其他類型的注釋區(qū)分開來。
??當(dāng)EOL注釋和可重復(fù)注釋在同一地址時,只有EOL注釋在列表中可見。如果刪除EOL注釋,可重復(fù)注釋將在列表中顯示。
??其實,在Ghidra還有一種注釋:附注Annotations。它可以在其設(shè)置注釋對話框中通過指向程序、URL、地址和符號的鏈接注釋做注釋。符號名稱更改時,注釋中的符號信息將自動更新。當(dāng)使用注釋來啟動指定的可執(zhí)行文件時,你可以提供可選參數(shù)以獲得更多控制。
??其實,本練習(xí)還有函數(shù)相關(guān)的,體現(xiàn)如何傳遞參數(shù)的,這就當(dāng)課外練習(xí)了,這個不是我們本教程的重點,這個是前置知識。
實驗
??有關(guān)本篇博文寂靜的羽夏就介紹這些,下面開始動手,破解crakeMe,也就是第四個練習(xí)。這次先從源碼的角度,來分析這個破解這個練習(xí)。下一篇博客園博文,我們將從逆向者的角度,來分析這個程序。
??通過比對源碼,我們看到如下偽代碼:
if (local_14 != 4) break;
iVar1 = crackMe();
if (iVar1 == 0) {
puts("抱歉,沒成功哦,再試一次!");
}
else {
puts(">> 祝賀破解成功!");
}
??也就是說,第四個練習(xí)是調(diào)用crackMe,判斷是否非零決定是否成功。我們跟進(jìn)去:
bool crackMe(void)
{
int iVar1;
iVar1 = getKey();
return iVar1 == 0x123456;
}
??這個函數(shù)很簡單,調(diào)用getKey函數(shù),看看是否返回值是0x123456,如果是返回真,反之為假,這個是判斷是否破解成功的依據(jù)。接下來我們看看getKey干了啥:
int getKey(void)
{
int local_c;
puts("請輸入密鑰:");
__isoc99_scanf("%d",&local_c);
return local_c;
}
??可以看到,該函數(shù)只是讀取一下輸入內(nèi)容,作為整數(shù)返回到調(diào)用者。
??至此,簡單的博文就到此結(jié)束。
下一篇
本文來自博客園,作者:寂靜的羽夏 ,一個熱愛計算機(jī)技術(shù)的菜鳥
轉(zhuǎn)載請注明原文鏈接:http://www.rzrgm.cn/wingsummer/p/16695557.html



浙公網(wǎng)安備 33010602011771號