Questi esempi sono molto più facili rispetto a quello visto precedentemente, che è un attacco di buffer overflow con lo scopo di acquisire privilegi elevati.
Ecco il codice da attaccare:
// nome file: stack1.c
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv){
int cookie;
char buf[80];
printf("buf: %08x cookie: %08x\n", &buf, &cookie);
gets(buf);
if(cookie == 0x41424344){
printf("you win!");
}
}
C
cookie
gets
che prende in input dati inseriti dall'utente.Per fare stampare al programma you win!
dobbiamo assegnare un valore specifico a cookie
, che è 0x41424344
.0x41424344
sono quattro byte.
Ricordiamo che scrivendo byte dobbiamo rispettare l'ordinamento di essi, che ricordiamo essere little endian.
Sappiamo che un char è un byte.
Un intero corrisponde a 4 byte.
Quindi possiamo scrivere 4 caratteri in cookie per far si che corrispondano al valore esadecimale desiderato.
Inserendo in un convertitore online (qualsiasi) di valori esadecimale in testo, verifichiamo che:
Tale indirizzo corrisponde ai caratteri ABCD
.
L'architettura è little endian, quindi dovremo i valori nell'ordine opposto: DCBA
.
Quando il programma viene eseguito vi è una funzione gets
avviata, che attende elementi in input. Possiamo scrivere 80 caratteri casuali e alla fine accodare DCBA
, oppure possiamo farci aiutare da python
a creare un testo che abbia esattamente il numero di caratteri che ci serve, così da copiarlo ed incollarlo una volta mandato in esecuzione il nostro programma target:
Questo è il risultato:
-z execstack -fno-stack-protector