緩沖區(qū)溢出解密一
互聯(lián)網(wǎng) 發(fā)布時間:2008-10-08 19:04:09 作者:佚名
我要評論

緩沖溢出弱點誕生于70年代。Morris Worm(80年代)可以認為是它們的第一次公開應(yīng)用。從90年代開始,相關(guān)的文檔,如著名的Aleph1的”Smashing the Stack for Fun and Profit”和代碼已經(jīng)在互聯(lián)網(wǎng)上公開。
這篇文章是關(guān)于某種需要非常重視的主題的系列文
好了,我們說將被放到EIP中的值是CPU自身計算出來的。如果我們JMP到一個函數(shù)又是什么樣子的呢?函數(shù)中指令的地址將在內(nèi)存中的其它地方。它們執(zhí)行后,CPU是如何知道到哪里繼續(xù)調(diào)用程序執(zhí)行呢?為了這個目的,在我們JMP到函數(shù)前,我們在一個臨時寄存器中保存下一個指令地址,比如說在EDX中;并且在從函數(shù)返回之前,我們又把EDX中的地址寫回EIP。如果我們使用JMP來跳轉(zhuǎn)到函數(shù)地址,那將可能實際上是一個非常煩人的工作。
然而,ix86處理器家族給我們提供了兩個指令:CALL和RET,使我們的生活簡單!CALL指令把”函數(shù)返回后下個要被執(zhí)行的指令”寫入堆棧。它PUSH地址到堆棧,并且把函數(shù)地址寫入EIP。因而,一個函數(shù)調(diào)用就產(chǎn)生了。另一方面,RET指令從堆棧中POP出”返回地址”,并且把地址寫入EIP。因而,我們將從函數(shù)安全地返回,而且繼續(xù)了程序的下一步執(zhí)行。
讓我們看看下面的代碼片段:
x = 0;
function(1, 2, 3);
x = 1;
在幾個匯編指令運行(x=0)之后,我們需要到function()所在的內(nèi)存位置。就如我前面所說的,為了實現(xiàn)這一目標,首先我們拷貝返回地址的地址(在這個例子里是x=1的指令地址。)到一些臨時空間(可能是一個寄存器)用JMP跳轉(zhuǎn)到函數(shù)的地址空間,而且,在函數(shù)結(jié)束時我們恢復我們將要拷貝到EIP的返回地址。
感謝上帝,所有這些麻煩的操作都由CPU自身通過CALL和RET為我們做了,而你能從上面的篇章中得到相關(guān)細節(jié)。 一般地,程序堆棧區(qū)域能夠象這樣表示:
|_parameter_I____| ESP 8
|_parameter II___| ESP 4
|_return address_| ESP
Figure X : Stack
ESP,EBP
如我們已經(jīng)說過的,堆棧同樣被用來存儲動態(tài)變量。動態(tài)地,程序請求新的空間時,CPU PUSH一些數(shù)據(jù)而我們的程序釋放一些數(shù)據(jù)時它就POP一些數(shù)據(jù)。為了給內(nèi)存編址,我們使用”相對尋址”。也就是說,我們在我們的堆棧中給數(shù)據(jù)編址,與一些標準相關(guān)。而這個標準就是ESP,它是Extended Stack Pointer首字母縮寫。這個寄存器指向堆棧的頂端??紤]這個:
void f()
{
int a;
}
可以看出,在f()函數(shù)中,我們?yōu)橐粋€名為a的整型變量分配空間。整型變量a的空間將在堆棧中分配。而計算機將引用它的地址作為ESP- 的一些字節(jié)。因此堆棧指針對程序執(zhí)行是非常重要的。若我們調(diào)用一個函數(shù)呢?這個調(diào)用的函數(shù)有一個堆棧,它有一些局部變量,意味著它將要利用堆棧指針寄存器。同樣地,內(nèi)部被調(diào)用的函數(shù)將有局部變量而且它也將需要堆棧指針。
為了克服這個,我們保存老的堆棧指針。就象我們對返回地址所做的那樣,我們PUSH老的ESP到堆棧,并且利用另外一個名為EBP的寄存器來引用被調(diào)用函數(shù)的局部變量。
相關(guān)文章
- “CMOS密碼”就是通常所說的“開機密碼”,主要是為了防止別人使用自已的計算機,設(shè)置的一個屏障2023-08-01
QQScreenShot之逆向并提取QQ截圖--OCR和其他功能
上一篇文章逆向并提取QQ截圖沒有提取OCR功能, 再次逆向我發(fā)現(xiàn)是可以本地調(diào)用QQ的OCR的,但翻譯按鈕確實沒啥用, 于是Patch了翻譯按鈕事件, 改為了將截圖用百度以圖搜圖搜索.2023-02-04- QQ截圖是我用過的最好用的截圖工具, 由于基本不在電腦上登QQ了, 于是就想將其提取出獨立版目前除了屏幕錄制功能其他都逆出來了, 在此分享一下2023-02-04
非系統(tǒng)分區(qū)使用BitLocker加密導致軟件無法安裝的解決方法
很多電腦用戶在考慮自己電腦磁盤分區(qū)安全時會采用 Windows 自帶的 BitLocker 加密工具對電腦磁盤分區(qū)進行加密。但有些人加密后就會忘記自己設(shè)置的密碼從而導致在安裝其它軟2020-11-25防止離職員工帶走客戶、防止內(nèi)部員工泄密、避免華為員工泄密事件的發(fā)生
這篇文章為大家詳細介紹了如何才能防止離職員工帶走客戶、防止內(nèi)部員工泄密、避免華為員工泄密事件的發(fā)生,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-27徹底防止計算機泄密、重要涉密人員離職泄密、涉密人員離崗離職前防范舉
近些年企業(yè)商業(yè)機密泄漏的事件屢有發(fā)生,這篇文章主要教大家如何徹底防止計算機泄密、重要涉密人員離職泄密、告訴大家涉密人員離崗離職前的防范舉措,具有一定的參考價值,2017-06-27- 最近有電腦用戶反應(yīng)量子計算機可以破解下載的所有的加密算法嗎?其實也不是不可以,下面虛擬就為大家講解買臺量子計算機,如何分分鐘破解加密算法2016-09-26
怎么破解Webshell密碼 Burpsuite破解Webshell密碼圖文教程
webshell是以asp、php、jsp或者cgi等網(wǎng)頁文件形式存在的一種命令執(zhí)行環(huán)境,一種網(wǎng)頁后門。黑客通常會通過它控制別人網(wǎng)絡(luò)服務(wù)器,那么怎么破解webshell密碼呢?一起來看看吧2016-09-19- 本文討論了針對Linux系統(tǒng)全盤加密的冷啟動攻擊,大家都認為這種攻擊是可行的,但執(zhí)行這么一次攻擊有多難?攻擊的可行性有多少呢?需要的朋友可以參考下2015-12-28
防止泄露公司機密、企業(yè)數(shù)據(jù)防泄密軟件排名、電腦文件加密軟件排行
面對日漸嚴重的內(nèi)部泄密事件,我們?nèi)绾问刈o企業(yè)的核心信息,如何防止內(nèi)部泄密也就成了擺在各個企業(yè)領(lǐng)導面前的一大問題。其實,針對內(nèi)網(wǎng)安全,防止內(nèi)部信息泄漏早已有了比較2015-12-17