Realmente estoy tratando de entender el concepto del ataque hecho posible por el código que figura a continuación.
Observo que se está utilizando strcpy
, que no realiza ninguna verificación de límites y, por lo tanto, habilita los ataques de saturación del búfer. Además, dado que se están utilizando malloc
y free
, sé que este código de ejemplo está tratando de ilustrar el concepto de un ataque de saturación del montón.
Ok. ¿Qué sé sobre el montón? Se verá algo así:
Ytodoslosargumentosdelalíneadecomandossepuedenusarparasobrescribirloquesigueenelmontóndespuésdeellos.¿Quémegustaríasobreescribir?¿Yconquéquisierasobrescribirestaubicacióndememoria?
malloc()
llamaalunlink()
makro,quetomaunelemento(unfragmento)delalistalibrededobleenlace,yfree()
llamaalfrontlink()
makro,queagregaunfragmentoalalistalibre.
Ahora,séquequierosobrescribirunpunterohaciaatrásohaciaadelante.¿Cuálexactamente?
Echemosunvistazoalfrontlink()
makro:
BK=FD->bk;P->bk=BK;P->fd=FD;FD->bk=BK->fd=P;
Siemprequellamemosfree()
,queremosagregarPalalistalibre.Simplementesepondrádondequieraquehayaunespaciolosuficientementegrandeenlalistalibre,creo.Yahoraechamosunvistazoalelementodebajo(BK)PyalelementoarribaP(FD).Yluegorealizamoslasaccionesindicadasanteriormente,dondefdeselpunterohaciaadelanteybkeselpunterohaciaatrás.
Nisiquierasésiestacosafrontlink()
esimportanteparaesteataque.¿Alguienpuedeexplicarmecómosepuedeexplotarelcódigoquefiguraacontinuación?Porfavor,dameunarespuestafácildeentender,yaquesoyrealmentenuevoenesteasunto.Graciasportuayuda!
#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;
}