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;
}