棧對齊對棧溢出帶來的影響

//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

相關文章
相關標籤/搜索