今天雖然還是很忙,但太久沒寫 Pwn 了,不能再混了~
接續上次的那題:
#include <stdio.h>
#include <stdlib.h>
void game() {
    long val = 0xdeadbeef;
    char buf[4] = "abcd";
    printf("Input: ");
    scanf("%4s",&buf);
    printf("buf: %s\n",buf);
    printf("val: 0x%08x\n",val);
    if(val == 0xdeadbe00) {
        printf("GOOD!!\n");
    } else {
        printf("BAD!!\n");
    }
}
int main() {
    game();
    return 0;
}
在我們觀察下記憶體前,再多講一個 register:rbp
他是做甚麼用的呢?
低地址
==========================
|    .text (程式碼)       |    //r-x
--------------------------
|    .data (已初始化資料)  |    //rw-
--------------------------
|    .bss (未初始化資料)   |    //rw-
--------------------------
|        ↓ Heap           |   //rw-
--------------------------
|        ↓                |
--------------------------
|                         |
--------------------------
|                         |
--------------------------
|        ↑                |
--------------------------
|        ↑ Stack          |   //rw-
===========================
高地址
還記得我們的 stack 嗎,stack 會從高地址往低地址方向長,而如同我們前幾篇講到的,只要呼叫個函式就會生成一塊 stack 區域來放函式裡的資料(補充:這區域稱為 stack frame)。而 stack 的底(高地址)會用 rbp 指著,stack 的頂(低地址)則會用 rsp 指著。
所以具體來說,執行時會變這樣:


以上這段修改 register 創建 stack frame 的程式稱為 prologue。
之後將會繼續看呼叫 game 時的狀況。
再來我們來介紹今天的主題:

絲子雜燴是河北八大碗的其中一道料理,絲子雜燴的意思是將食材切絲做成的雜燴。
(找不到圖,因此圖為八大碗,之後再來介紹八大碗。)