<aside> 🚩
This level introduces the concept that memory can be accessed ouside its allocated region, how the stack variables are laid out, and that modifying outside of the allocated memory can modify program execution
</aside>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char **argv)
{
volatile int modified;
char buffer[64];
modified = 0;
gets(buffer);
if(modified != 0) {
printf("you have changed the 'modified' variable\\n");
} else {
printf("Try again?\\n");
}
}
L’obiettivo della sfida è la modifica del valore della variabile modified
a tempo di esecuzione
// info su protostar
Il programma stampa un messaggio di conferma se la variabile modified
è diversa da zero
Notiamo inoltre che le variabili modified
e buffer
sono spazialmente vicine
Idea: scrivere 68 byte in buffer
gets()
gets()
è deprecata in favore di fgets()
che limita i caratteri letti
→ non c’è controllo sul buffer overflow
→ gets()
permette input più grandi di 64 byte
pmap
Stampa il layout di memoria di un processo in esecuzione
Dall’output di pmap
vediamo che il layout di memoria è organizzato in diverse aree
r-x
r--
rw-
rw-, [ stack ]