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