null

介紹 如果你的 Windows 程序需要在開機(jī)后用戶登錄之前就開始運(yùn)行、且在用戶注銷之后也不停止,那么你需要將程序注冊(cè)為一個(gè)系統(tǒng)服務(wù)。 然而,在 Windows 下編寫一個(gè)可...
您好,這里不是口誤。x86架構(gòu)中的棧是向低地址增長(zhǎng)的,也就是說棧頂是高地址、棧底是低地址。但在畫內(nèi)存布局圖的時(shí)候卻是不同的人有不同的風(fēng)格。有人喜歡把高地址畫在上面、低地址畫在下面,也有人喜歡反過來畫(把高地址畫在下面、低地址畫在上面)。如果按第一種方式畫圖,那么棧就是向下增長(zhǎng),如果按第二種方式畫,那么棧向上增長(zhǎng)。但不管圖怎么畫,棧都是向低地址增長(zhǎng)的。
因?yàn)楸疚乃械膱D都是按第二種方式畫圖,和一般的教科書上是相反的,所以這里特別強(qiáng)調(diào)一下“(請(qǐng)注意下圖是按棧頂在上、棧底在下的方式畫的)”。
至于為什么要反過來畫,你看一下本文的第一個(gè)shellcode對(duì)應(yīng)的那個(gè)內(nèi)存布局圖就知道原因了(就是第一行是“eb 1e (jmp END)”的那個(gè)圖),按這種方式畫,shellcode中的第一條指令剛好在圖中的最頂上,shellcode的運(yùn)行順序和人的閱讀順序是一致的,而如果按常規(guī)的方式畫,那個(gè)第一條指令要畫在圖中的最底下,shellcode的運(yùn)行順序和閱讀順序相反。
棧溢出攻擊及防護(hù)方法簡(jiǎn)介0. 引言 如果你學(xué)的第一門程序語(yǔ)言是C語(yǔ)言,那么下面這段程序很可能是你寫出來的第一個(gè)有完整的 “輸入---處理---輸出” 流程的程序: 也許這段小程序給你帶來了小小的成就...
前言 這個(gè)markdown的語(yǔ)法還沒學(xué)完整,不知道如何更好的整理自己的思路,所以嘗試起來的動(dòng)力很小,希望能很快克服。 以下都是嘗試的部分 這部分主要是用于練習(xí)markdown...
@yiltoncent 理解內(nèi)存布局隨機(jī)化主要是要了解操作系統(tǒng)加載用戶程序的步驟,籠統(tǒng)來說:打開一個(gè)用戶程序(或者說進(jìn)程)時(shí),操作系統(tǒng)分配給進(jìn)程一片單獨(dú)的內(nèi)存空間(可以簡(jiǎn)單的認(rèn)為這段空間就是0x0000000000000000~0xffffffffffffffff),之后操作系統(tǒng)將程序的二進(jìn)制指令碼擺到這片空間的一塊地方、將棧擺在另一塊地方、將動(dòng)態(tài)鏈接庫(kù)擺在另一塊地方,最后設(shè)置rip為程序的第一條指令的地址,之后就交給用戶進(jìn)程執(zhí)行了。在以前,操作系統(tǒng)擺放這三塊(指令、棧、動(dòng)態(tài)鏈接庫(kù))的位置都是固定的,為了防護(hù)棧溢出攻擊,每次運(yùn)行程序時(shí),操作系統(tǒng)會(huì)將指令、棧和動(dòng)態(tài)鏈接庫(kù)擺到隨機(jī)的位置,這就是內(nèi)存布局隨機(jī)化。當(dāng)然實(shí)際的加載步驟和方式比上面說的要復(fù)雜的多,但是大致的輪廓差不多。
ROP看似很難,其實(shí)背后的原理非常簡(jiǎn)單,僅僅是利用了`ret指令`的效果。ret指令名為`return`,實(shí)為`jmp [rsp]`,或者`pop rip`,它就是將棧頂保存的數(shù)字出棧,再跳轉(zhuǎn)到這個(gè)數(shù)字指向的空間。因此只要當(dāng)程序執(zhí)行到ret指令時(shí)、棧頂上保存的數(shù)字剛好是下一段跳板指令的地址,那么這個(gè)ret指令就會(huì)跳轉(zhuǎn)到下一條跳板指令。通過這種方式,就可以把一些簡(jiǎn)單的跳板指令串起來運(yùn)行,組裝成復(fù)雜的攻擊程序。
棧溢出攻擊及防護(hù)方法簡(jiǎn)介0. 引言 如果你學(xué)的第一門程序語(yǔ)言是C語(yǔ)言,那么下面這段程序很可能是你寫出來的第一個(gè)有完整的 “輸入---處理---輸出” 流程的程序: 也許這段小程序給你帶來了小小的成就...
@yiltoncent 謝謝。其實(shí)如果對(duì)x86匯編熟的話還是比較容易理解的。最主要的就是理解call和ret這兩個(gè)指令,call指令將返回地址入棧、并跳到目標(biāo)地址,而ret指令將返回地址出棧并跳到返回地址。如果攻擊者可以往棧上寫任意長(zhǎng)的數(shù)據(jù),他就可以改寫該返回地址,將cpu引導(dǎo)到他的攻擊指令那里。
棧溢出攻擊及防護(hù)方法簡(jiǎn)介0. 引言 如果你學(xué)的第一門程序語(yǔ)言是C語(yǔ)言,那么下面這段程序很可能是你寫出來的第一個(gè)有完整的 “輸入---處理---輸出” 流程的程序: 也許這段小程序給你帶來了小小的成就...
0. 引言 如果你學(xué)的第一門程序語(yǔ)言是C語(yǔ)言,那么下面這段程序很可能是你寫出來的第一個(gè)有完整的 “輸入---處理---輸出” 流程的程序: 也許這段小程序給你帶來了小小的成就...