Stack Lab · Step 1 of 5 · Benign input
SAFE saved rip = 0x0000555555555230
Memory x/10gx $rsp

        
gdb session
Stack frame · gets() writes left → right · high addresses on the right $rsp = 0x7fffffffdc30
Stack frame start_level() · 64 B
buffer[64] 64 B · gets() target
Saved state RBP + return addr · 16 B
saved RBP 8 B
saved return 8 B · popped by ret
buffer[64] saved RBP saved return overflowed
The vulnerable source stack-four.c
#include <stdio.h>
#include <stdlib.h>

void complete_level(void) {
    printf("Congratulations, you've finished!\n");
    exit(0);
}

void start_level(void) {
    char buffer[64];
    gets(buffer);                  /* no bounds check */
}

int main(int argc, char **argv) {
    start_level();
    return 0;
}
Stack vs. heap overflow
StackHeap
Buffer lives onThe call stackThe glibc heap
Adjacent targetsSaved RBP, saved returnNext chunk's metadata + payload
Control-flow hijackReturn address on retFunction pointer / vtable
Modern mitigationStack canaryHeap cookies, PAC
ClassLinear OOB write (CWE-787)