栈溢出笔记1.2 覆盖EIP
1.1節(jié)中我們說到可以利用棧溢出來破壞棧中原有的內(nèi)容,這一節(jié)中,我們就來看看如何爭(zhēng)奪到返回地址(EIP),使得我們可以隨意控制它的值,這樣我們就可以控制程序。來看一個(gè)經(jīng)典的程序:
這個(gè)程序的get_print函數(shù)中定義了一個(gè)大小為11個(gè)字節(jié)的數(shù)組,正常情況下我們的輸入應(yīng)該最多為10個(gè)字符(還有一個(gè)\0結(jié)束符),而gets函數(shù)沒有明確定義輸入的大小,因此,我們可以輸入超過10個(gè)字符,從而造成棧溢出。如下,輸入10個(gè)‘A’,一切正常:?
?
圖8?
當(dāng)我輸入11個(gè)‘A’時(shí),雖然順利打印出來11個(gè)‘A’,但是VS2008報(bào)了如下錯(cuò):?
?
圖9
運(yùn)行時(shí)錯(cuò)誤檢查檢測(cè)到棧崩潰,這是Windows為抵抗棧溢出漏洞利用采用的措施。目前我們還不知道如何繞過,先去掉它,在工程屬性中,“C/C++”——“代碼生成”的“基本運(yùn)行時(shí)檢查”選擇為默認(rèn)值,然后重新編譯。?
?
圖10
修改后,輸入11個(gè)‘A’貌似是沒什么問題了,但是輸入12個(gè)‘A’的時(shí)候,又出來一個(gè)這樣的對(duì)話框:?
?
圖11
緩沖區(qū)溢出被檢查到了,這當(dāng)然不是一個(gè)好消息。作為經(jīng)典的漏洞,Windows自然有多種對(duì)付招式,這又是一種叫做棧Cookie的保護(hù)方式,可以檢查到棧溢出。同樣,先去掉它,在工程屬性中,“C/C++”——“代碼生成”的“緩沖區(qū)安全檢查”選擇為否(GS-, 見圖10),然后重新編譯。這一次,我們輸入一大串‘A’:
?
圖12
什么?VS2008又出現(xiàn)了彈窗?別緊張,這次是好消息。?
?
圖13
看到熟悉的0xC0000005,表明是訪問了不該訪問的地址。同時(shí),0x41414141不就是“AAAA”嗎?這說明我們輸入的“AAAA”已經(jīng)以某種方式被程序使用了,這果斷是好消息。
下面,用Immunity Debugger來看看究竟發(fā)生了什么。先找到函數(shù)get_print()的代碼,在 MOV EBP, ESP語句上下斷點(diǎn):
?
圖14
然后運(yùn)行到這里,查看棧內(nèi)容:?
?
圖15
回想1.1中的內(nèi)容,get_print沒有參數(shù),因此0012FF14(當(dāng)前ESP)處為保存的EBP,0012FF18(EBP+4)為返回地址(重要)。
下面兩句分配棧幀的代碼對(duì)棧的影響較大:
/*********************************************************/ MOV EBP, ESP SUB ESP, 4C /*********************************************************/- 1
- 2
- 3
- 4
分配了4C(76字節(jié))大小的空間,因此,下面這段棧空間(get_print)是我們關(guān)注的內(nèi)容:?
?
圖16
現(xiàn)在,定位到gets函數(shù),我們關(guān)注的不是它的調(diào)用過程,而是參數(shù),它位于棧上EBP-C的位置,因此,它緊鄰保存的EBP。也就是說,這個(gè)緩沖區(qū)下面是保存的EBP,再下面是保存的返回地址。這很重要,它決定我們需要輸入多少內(nèi)容才能準(zhǔn)確地改寫保存的返回地址(EIP)。
我們?cè)趃ets函數(shù)之后設(shè)斷點(diǎn),并輸入以下內(nèi)容(16個(gè)A和4個(gè)B):
?
圖17
此時(shí),查看棧內(nèi)容:?
?
圖18
看到了嗎?保存的EBP被‘AAAA’覆蓋,保存的返回地址(EBP+4)被BBBB覆蓋。因?yàn)?#xff0c;我們知道局部變量的準(zhǔn)確位置,因此,可以準(zhǔn)確的知道需要多少字節(jié)來覆蓋返回地址的內(nèi)容。?
這樣,我們就從程序手中爭(zhēng)奪了EIP,get_print()返回時(shí),它將跳轉(zhuǎn)到0x42424242處執(zhí)行,由于該地址不可訪問,因此會(huì)出現(xiàn)0xC0000005錯(cuò)誤。后面,我們將給EIP寫入有意義的地址,從而執(zhí)行我們自己的內(nèi)容。
總結(jié)
以上是生活随笔為你收集整理的栈溢出笔记1.2 覆盖EIP的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 高级IO函数之sendfil
- 下一篇: 第四百一十七天 how can I 坚持