欧美乱码精品一区二区三区,风流少妇又紧又爽又丰满,被债主在夫面前人妻被强,国产精品视频永久免费观看

?
內(nèi)容中心
按關(guān)鍵字查找
數(shù)據(jù)庫安全漏洞淺析之緩沖區(qū)溢出漏洞(2)
作者:安華金和 發(fā)布時(shí)間:2017-01-25

前文中我們對(duì)數(shù)據(jù)庫安全漏洞中最為常見的一種——緩沖區(qū)溢出漏洞進(jìn)行了簡單的概念介紹。在靜態(tài)數(shù)據(jù)溢出、棧溢出和堆溢出三種類型中,棧溢出和堆溢出相對(duì)來說更復(fù)雜,且危害范圍較大,在前文概念介紹的基礎(chǔ)上,本文對(duì)windows下的棧結(jié)構(gòu)進(jìn)行更直觀的介紹,通過構(gòu)造一段代碼示例,更清晰的演示棧結(jié)構(gòu)下的緩沖區(qū)溢出漏洞原理。

下面我們將構(gòu)造一段代碼,完成3個(gè)任務(wù):

1.演示W(wǎng)IN下棧的結(jié)構(gòu)

2.演示緩沖區(qū)溢出改變函數(shù)控制流程

3.演示緩沖區(qū)溢出覆蓋返回地址(劫持函數(shù))

下面的程序包含一個(gè)主函數(shù)main和另外一個(gè)子函數(shù)re_choose。re_choose函數(shù)用于把從main函數(shù)中取得的輸入字符串和存儲(chǔ)的字符串liusicheng做對(duì)比。如果輸入的字符串和存儲(chǔ)的字符串一致則返回0。如果不一致則可能返回1或者-1。同時(shí)還人為制造了一個(gè)緩沖區(qū)溢出點(diǎn)strcpy(buffer,input)。input有1024的空間,而buffer只有44的空間。只要input超過44則就會(huì)引發(fā)緩沖區(qū)溢出。main函數(shù)取re_choose返回值如果返回1或-1走if。如果返回0則走else。將用緩沖區(qū)溢出來讓返回1或者-1也走else。

#include <stdio.h>

#include <string.h>

#define ture_password "liusicheng"

int re_choose (char *input)

{

int result;

char buffer[44];

result = strcmp(input,ture_password);       

strcpy(buffer,input);                 //緩沖注入點(diǎn)

return result;

}

 void main()

{

int choose=0;        

char input[1024];

scanf("%s",input);

choose=re_choose(input);

if (choose == 1 || choose == -1)

{

printf("error\n");

else

{

printf("ture\n");

}

}

     

編譯出上面代碼的release版,放入IDA pro中得到反編譯代碼。下圖是MAIN函數(shù)的流程結(jié)構(gòu)。清楚的看到main函數(shù)的整個(gè)控制流程和main函數(shù)的棧從建立到銷毀的全過程。棧主要用在函數(shù)調(diào)用上。進(jìn)程調(diào)用的開始會(huì)調(diào)用大量系統(tǒng)函數(shù),其中大量函數(shù)的地址是固定不變的(只和操作系統(tǒng)版本有關(guān)系),這些固定的函數(shù)將成為以后用于跳轉(zhuǎn)的平臺(tái) 。本文先不涉及這些函數(shù)。直接跳到main函數(shù)開始介紹。棧的結(jié)構(gòu)是4個(gè)字節(jié)為一層。如果超過4個(gè)字節(jié)。按照4個(gè)整數(shù)倍存儲(chǔ)。不足4個(gè)字節(jié)按照4個(gè)字節(jié)存儲(chǔ)。棧的主要操作只有2種push和POP。push是把寄存器的內(nèi)容壓入到棧中,pop是把棧中的內(nèi)容釋放掉。ebp是當(dāng)前棧幀的棧底,esp是當(dāng)前棧幀的棧頂。(注意由于棧是順序執(zhí)行的所以同一時(shí)間只有一個(gè)棧頂和一個(gè)棧底。但棧底一般不是整個(gè)系統(tǒng)棧的棧底,而只是當(dāng)前這個(gè)棧幀的棧底)。棧的結(jié)構(gòu)采用先進(jìn)先出,后進(jìn)后出的原則。所以當(dāng)創(chuàng)建一個(gè)棧的時(shí)候會(huì)遵循如下步驟:

1把上一個(gè)棧幀的棧底的指針壓入當(dāng)前棧保存起來(push ebp)。這一步其實(shí)是2步:第一步壓入返回地址,第二步壓入當(dāng)上一個(gè)棧幀的ebp。

2把上一個(gè)棧幀的棧底移動(dòng)到上一個(gè)棧幀的棧頂(mov ebp,esp)。從此這個(gè)棧的棧底就確定且不會(huì)發(fā)生任何改變。棧頂esp會(huì)一直發(fā)生變化。

3接著分配局部函數(shù)(sub esp,404h)。本程序中2個(gè)變量1個(gè)是4字節(jié)1個(gè)是1024字節(jié)。加一起正好是0x404個(gè)字節(jié)。需要棧頂上移0x404。注意棧的方向和內(nèi)存相反。數(shù)據(jù)進(jìn)入內(nèi)存是從低地址向高地址寫,而棧則是從高地址向低地址寫。正是這種結(jié)構(gòu),給了后來數(shù)據(jù)改寫之前數(shù)據(jù)的機(jī)會(huì)。棧頂?shù)闹禃?huì)隨著棧中數(shù)據(jù)隨時(shí)進(jìn)行調(diào)整。 


          20170125-1.jpg
注意:上圖中var_404= -404h、str1= -400h

  同樣棧撤銷的時(shí)候基本可以按照棧建立的逆操作進(jìn)行。首先把棧底值覆蓋棧頂(mov esp,ebp)。接著棧中彈出當(dāng)前ebp的值(pop ebp)。然后跳轉(zhuǎn)EIP中存儲(chǔ)的上個(gè)函數(shù)的返回地址(retn),回到前一個(gè)棧幀中(上一個(gè)函數(shù)中)刪除返回地址行(add esp 4)。到此棧被完全撤銷。至此一個(gè)棧從建立到撤銷的全部過程已經(jīng)完成。我們除了關(guān)心一個(gè)棧的創(chuàng)建和消亡,更關(guān)心的就是棧是如何傳遞返回值和參數(shù)的。下圖是re_choose的反匯編圖:清楚的解釋了,在棧中是如何傳參和返回值的。

20170125-3.png            

注上圖中 var_4= -4 、str1 = 8

main函數(shù)從 call sub_401000這句開始,創(chuàng)建子函數(shù)re_choose的棧幀,開始也是和main一樣的棧創(chuàng)建過程。直到執(zhí)行到 mov eax,[ebp+str1],這句就是大家最關(guān)心的傳參。在棧中固定不動(dòng)的是棧底(ebp)。利用棧底為坐標(biāo)向高位內(nèi)存移動(dòng)8個(gè)字節(jié)取值。取到存在main中的input。放入eax寄存器中傳入re_choose用于計(jì)算。同樣的機(jī)制看后半段 從re_choose中 (mov eax,[ebp+var_4])取棧底向低地址偏移4個(gè)字節(jié)的內(nèi)容。存在eax中,main把eax值存入ebp-404(mov [ebp+var_404],eax)這個(gè)地址中用于后續(xù)的判斷。至此棧的基本結(jié)構(gòu)基本操作已經(jīng)介紹完畢。棧緩沖區(qū)溢出的根源和棧的自身結(jié)構(gòu)密切相關(guān)。正是由于棧中數(shù)據(jù)是先存入的在內(nèi)存高地址,后入的在內(nèi)存低地址。所以給了后入的機(jī)會(huì),一旦超過棧原本分配的長度則會(huì)直接覆蓋原先存在內(nèi)存高地址中的數(shù)據(jù)或指令。從而帶來不可預(yù)知的結(jié)果。

至于函數(shù)的參數(shù)傳入的順序是從左到右還是從右到左(局部變量int a,b 是先壓a還是先壓b),函數(shù)返回時(shí)恢復(fù)棧平衡是讓母函數(shù)作還是子函數(shù)作。這部分和函數(shù)調(diào)用約定相關(guān),主要的調(diào)用約定分為,_cdecl、_fastcall和_stdcall。一般VS默認(rèn)采用 _stdcall和windows api保持一致。stdcall規(guī)則要求:參數(shù)從右向左壓。(int a,b 先壓b)。函數(shù)退出的時(shí)候自己清理?xiàng)V械膮?shù)。(圖中經(jīng)常會(huì)看到一個(gè)參數(shù)后面沒用直接被add esp 4了)

至此,通過上面緩沖區(qū)溢出漏洞的實(shí)例演示,你應(yīng)該已經(jīng)了解了棧溢出的漏洞原理。后續(xù),我們將基于此實(shí)例,向大家介紹利用棧溢出漏洞的攻擊方式,以及隨之帶來的數(shù)據(jù)庫安全風(fēng)險(xiǎn)。通過這樣的實(shí)例演示,讓大家對(duì)此類漏洞原理產(chǎn)生深刻理解,并梳理出防護(hù)思路。


?
汕头市| 综艺| 巴林左旗| 思南县| 盐山县| 黄龙县| 卢氏县| 大邑县| 博兴县| 邮箱| 红安县| 双江| 四会市| 鹤庆县| 南皮县| 康平县| 定安县| 北川| 安国市| 乌拉特后旗| 襄汾县| 滨州市| 中山市| 广东省| 嵊州市| 钟山县| 东平县| 彭泽县| 中江县| 利川市| 新沂市| 尤溪县| 黄大仙区| 察隅县| 余江县| 铜川市| 泰州市| 保靖县| 乳源| 丹东市| 汤阴县|