//http://exploit-exercises.com/protostar/stack4 //一個棧溢出的小練習 #include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <string.h> void win() { printf("code flow successfully changed\n"); } int main(int argc, char **argv) { char buffer[64]; gets(buffer); }
0x1:
函數
一開始我想的棧結構 實際上的棧結構 .net
| EIP | | EIP |code
| EBP | | EBP |ci
|buffer變量內容 | | 白佔4字節 |
get
| ... ..... | | 繼續白佔4字節 |
string
| buffer變量內容 | | buffer變量內容 |
it
| 棧頂 | | ... .... |io
| buffer變量內容 |class
| 棧頂 |變量
0x2:白佔的八個字節是怎麼來的呢?爲何系統要讓他白佔八個字節呢?請看下面這張圖
能夠看到sub指令前的and指令改變了esp寄存器的值,esp的值減少後,就像整個棧被拉下來了一點,因此就空出來了一些.
以爲我說的不明白的能夠看我後面的連接,連接的內容也解釋了爲何是減小了8字節。
至於爲何系統要讓他白佔八個字節,這個就是棧對齊了,esp的地址對齊後,能夠加快存放數據的速度.
0x3:這個八個字節對棧溢出帶來的影響
開始不知道有棧對齊的時候,exploit代碼是 'A' x64+win函數地址
知道後的exploit代碼是 'A' x72+win函數地址 //多出的8個'A'就是爲了覆蓋白佔的8個字節
link:http://bbs.csdn.net/topics/100119366