日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

栈溢出笔记1.2 覆盖EIP

發(fā)布時(shí)間:2025/3/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 栈溢出笔记1.2 覆盖EIP 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。