Sto davvero cercando di capire il concetto di attacco reso possibile dal codice riportato di seguito.
Ho notato che viene utilizzato strcpy
, che non esegue controlli ai limiti e pertanto abilita gli attacchi di sovraccarico del buffer. Inoltre, poiché vengono utilizzati malloc
e free
, so che questo codice di esempio sta cercando di illustrare il concetto di un attacco di sovraccarico dell'heap.
Ok. Cosa so sull'heap? Sembrerà in questo modo:
Etuttigliargomentidellalineadicomandopossonoessereusatipersovrascrivereciòcheseguenell'heapdopodiessi.Cosamipiacerebbesovrascrivere?Ecosadovreivolersovrascriverequestaposizionedimemoriacon?
malloc()
chiamaunlink()
makro,cheaccettaunelemento(unchunk)dallalistaliberadouble-linkedefree()
chiamafrontlink()
makro,cheaggiungeunbloccoallalistalibera.
Orasochevogliosovrascrivereunpuntatoreall'indietrooinavanti.Quale?Esattamente?
Diamoun'occhiataalfrontlink()
makro:
BK=FD->bk;P->bk=BK;P->fd=FD;FD->bk=BK->fd=P;
Ognivoltachechiamiamofree()
,vogliamoaggiungerePallalistalibera.Saràsemplicementemessodovemaic'èunalacunaabbastanzagrandenellalistalibera,credo.Eoradiamounosguardoall'elementosottostante(BK)Peall'elementosopraP(FD).Epoieseguiamoleazionisoprariportate,dovefdèilpuntatoreinavantiebkèilpuntatoreall'indietro.
Nonsonemmenosequestacosadifrontlink()
siaimportanteperquestoattacco.Qualcunopuòspiegarmicomepuòesseresfruttatoilcodiceriportatodiseguito?Perfavore,dammiunarispostafaciledacapire,datochesonodavveronuovoinquestamateria.Grazieperiltuoaiuto!
#include<stdlib.h>#include<string.h>#include<stdio.h>voidwinner(void){printf("that wasn't too bad now, was it?\n");
}
int main(int argc, char **argv)
{
char *a, *b, *c;
a = malloc(512);
b = malloc(512);
c = malloc(512);
strcpy(a, argv[1]);
strcpy(b, argv[2]);
strcpy(c, argv[3]);
free(c);
free(b);
free(a);
printf("dynamite failed?\n");
return 0;
}