Bomba Logica

dev

Desafío de ingeniería inversa en C. Soluciones

Hace unas semanas hablé de un desafío propuesto por los profesores de Estructura de computadores de mi facultad. Ahora que ha finalizado el plazo de entrega de la práctica, escribo este artículo con los resultados que obtuve.

Como comenté, la practica consiste en averiguar dos contraseñas de un programa escrito en C compilado para 32 bits y sin opciones de depuración. El guión está escrito por los profesores Javier Fernandez y Mancia anguita bajo licencia creative commons BY-NC-SA y disponible para descargar más abajo en las referencias.

Todos los programas escritos por los alumnos estan basados en este:

#include <stdio.h>    // para printf()
#include <stdlib.h>   // para exit()
#include <string.h>   // para strncmp()/strlen()
#include <sys/time.h> // para gettimeofday(), struct timeval

char password[]="abracadabran";
int  passcode  = 7777;

void boom(){
 printf("***************n");
   printf("*** BOOM!!! ***n");
   printf("***************n");
   exit(-1);
}

void defused(){
   printf("·························n");
 printf("··· bomba desactivada ···n");
 printf("·························n");
 exit(0);
}

int main(){
#define SIZE 100
  char pass[SIZE];
  int  pasv;
#define TLIM 5
    struct timeval tv1,tv2; // gettimeofday() secs-usecs

    gettimeofday(&tv1;,NULL);

    printf("Introduce la contraseña: ");
  fgets(pass,SIZE,stdin);
   if (strncmp(pass,password,strlen(password)))
      boom();

 gettimeofday(&tv2;,NULL);
  if (tv2.tv_sec - tv1.tv_sec > TLIM)
       boom();

 printf("Introduce el código: ");
  scanf("%i",&pasv;);
    if (pasv!=passcode) boom();

 gettimeofday(&tv1;,NULL);
  if (tv1.tv_sec - tv2.tv_sec > TLIM)
       boom();

 defused();
}