開頭
上一篇博客講到了堆疊溢位,關于做堆疊溢位實驗,可使用的工具是反匯編工具,
之前講到了IDA的實作:
點擊進入IDA實作堆疊溢位博客
感興趣的也可以看看,
~
現在說到老師上課可能更喜歡用的反匯編軟體OllyDbg,來實作一下簡單的堆疊溢位實驗,
~
軟體介紹:OllyDbg


摘自百度:
<<<OD,是一個反匯編工具,又叫OllyDebug,一個新的動態追蹤工具,將IDA與SoftICE結合起來的思想,Ring 3 級的除錯器,己代替SoftICE成為當今最為流行的除錯解密工具了,同時還支持插件擴展功能,是目前最強大的除錯工具,基本上,除錯自己的程式因為有原始碼,一般用vc,破解別人的程式用OllyDebug,>>>
~
~~下面簡稱OD
~
IDA與OD
~
說簡單點,OD是一款火爆的反匯編工具,免費也是其特點,優點可能對電腦環境要求并不高,缺點是其運行很復雜,函式名之類的資訊不清晰,等于要自己找,
IDA相比于OD,更加方便,這點可以從我上一篇博客看出,同時IDA操作簡單,但要付費,即使其破解版在機房的電腦上一般不好運行,所以導致學校老師教學一般用OD,這里開講,怎么用更復雜的OD(ollydbg).
~
1.打開軟體

可以清楚看到界面:
看到很多框體,再細看一下:

2.準備好要運行的程式
即準備好實作堆疊溢位的代碼,和上一篇博客代碼一樣,可以對比:
~
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void attack()
{
printf("This is attack.\n"); //attack函式
}
void func() //func函式
{
char password[6] = "ABCDE";
char str[6];
FILE *fp;
if(!(fp=fopen("D:\\password.txt","r"))) //打開D盤的password.txt檔案
exit(0);
fscanf(fp,"%s",str); //將str的內容寫入fp
str[5]='\0';
if(strcmp(str,password)==0) //判斷str是否與password相同
printf("OK.\n");
else
printf("NO.\n");
}
int main()
{
func(); //運行func函式
return 0;
}
~
同樣上面的fscanf函式是導致堆疊溢位的問題所在,也就是說當fscanf讀取了大于str容量的字串,導致了其資料在堆疊上的溢位,從而影響函式的正常運行,
類似的,像gets,strcpy等函式,當讀取比設定的容量大時,都會發生堆疊溢位,
~
注意:
~
為防止堆疊溢位漏洞出現,最近的vs系列,vs2018,2019等都會提醒不要使用不安全的函式,而使用安全的會進行邊界檢查的函式,所以堆疊溢位實驗無法在vs系列上實作,
~
vc 6.0 和 codeblocks上依舊可以進行堆疊溢位實驗,可以在這兩個編譯器上實作該實驗,
3.代碼運行

在記事本中輸入AAAAAA…運行程式,由于其與password不同,所以輸出“NO”
4.OD開始反匯編
將該程式的可執行檔案拖入OD:

出現了很多復雜的資料,其實作在只需要關注左上角的區域即可:(放大來看)

1,首先看左邊紅色區域:大家應該很熟悉,這是16進制碼
2,中間藍色的區域:這是匯編代碼,學過匯編的人看得出來,
3. 右邊紫色框選的區域:可以看作為偽代碼,(個人認為)可以看到出現了一些程式中有的字串和一些類似的細節,
~
相當于中間是匯編代碼,即該exe檔案轉換為的匯編代碼,左邊是該行對應的16進制代碼,右邊是偽代碼,
~
這里和IDA的分析結果一樣,都通過反匯編,讓你得以查看可執行檔案的匯編代碼和偽代碼,當然也能查看堆疊,
~
IDA是分散的框體,而OD把其放在了一起,
~
這里就要說到IDA的函式名很方便查找,而OD得函式名只能自己從上表中分析,甚至沒有明確的函式名,
~
但是
~
OD可以進行動態除錯,而IDA只能靜態,這是截然不同的,但又相互聯系,
重要:OllyDbg的相關快捷鍵
這個是很重要的OD的操作快捷鍵,其實更多的功能,自己可以試出來,這里只說必須的:
~
(1)F2(左鍵雙擊):設定斷點
~


雙擊或F2的位置變紅了,當程式再運行時,會自動運行到斷點處,則不會再往下運行,用于動態分析查看, 再按F2取消斷點, 或者點擊右鍵選擇–>breakpoint–>toggle.
~
(2) F7,選中的區域向下,但碰到子程式時會進入其中,可以查看子程式資訊,
~
(3) F8,單純地向下一個資訊移動,
~
(4)Ctrl+F12, 即為"restart"重新開始運行程式, 但會在斷點處停住:

(5)F9 繼續運行函式,直至斷點:

4.開始分析如何“堆疊溢位”
這個框體里的內容很多,向下滾輪,在最右邊的偽代碼中尋找與代碼有關的內容,人看的懂的內容,在往下滾時,看到了"this is attack","password"字樣,說明找到了func()和attack()函式(見下圖)

那么下圖框選的"PUSH EBP"應該是attack(),func()函式的開頭,記下函式入口地址:
~
attack()地址: 00401350
func()函式地址:00401365
~

再稍微往下一劃,看到"fopen,fscanf"等函式,以及"OK"和"NO"的代碼區
堆疊溢位發生在fscanf函式處,不如在fscanf下,strcmp之上,設定一個斷點,再次運行后,函式會停在那里,

之后,按“F7”向下運行,碰到子程式,就會自動進入子程式,果然在"004013D1"處發生了跳轉,其匯編代碼中CALL也是一種跳轉的代碼,查看到了str所在的堆疊,
注意:在這里設定一個斷點

5.看到堆疊的資訊
可以看到文本檔案輸入的"AAAAA…“在堆疊道中一目了然:
這里就是OD中堆疊的資訊:
~
該結構與之前的類似:
左邊的"41414141"是16進制,中間的“AAA”是你輸入的字串,右邊類似偽代碼
~

當你在文本中輸入不同數目的A時,你會發現A是從上往下增長的,輸入不同的A,然后restart重新運行,再按F9 .
~
A明顯從“0060FEE0”處往下增長,
~
在堆疊中看到(下圖)在“0060FEFC”處存的是"RETURN from"函式,可以得知函式運行到此處時會進行跳轉,這就是所謂的"ret”,跳轉地址,
~

在上圖可以看到“RETURN”右邊的地址為“00401407”說明函式運行到這里會跳轉到“00401407”,從“RETURN…”一串英文的意思也可以看出,那么只要將文本中輸入的A的數量增加,那么,A就會覆寫其正確的地址,
~
“0060FEFC”處存放了要回傳的地址,而其上面就是文本輸入的A,A往下溢位會影響其地址,
~
因為A會往下堆積,溢位到“RETURN ”處,只要將A們的最后四位改成其他地址,那么函式就會跳轉到別的地方,
~

6.修改文本,制造堆疊溢位
從上圖看出從開頭的地址到跳轉地址有7行,即28個十六進制,
~
那么,在文本中先輸入28個A,再加入attack()函式的地址,回傳地址就會被覆寫,
~
用HxD進行編輯:

編譯后,再用OD,Ctrl+F2,重新來過,不停按F9,來到這里:

可以看到原本的“0060FEFC”即回傳地址,已經變成了,attack()函式的入口,上面全是AAAAA,而這地址就是剛剛輸入的,
~
再看看函式的運行結果:
果然
~
7. 結果

成功了,原理與上次的一樣,有點復雜,大家想的話可以細看,感謝閱讀,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/171619.html
標籤:其他
上一篇:利用UDP埠轉發繞過校園網認證
