Asm

dev

Desafío de ingeniería inversa en C

Puedes encontrar la solución a esta práctica en Desafío de ingeniería inversa en C - Soluciones En la asignatura Estructura de Computadores de mi facultad, estamos haciendo una práctica que consiste en coger un ejecutable que haya compilado otro alumno, el cual pide una contraseña alfanumérica y otra numérica. Dicho ejecutable está compilado sin opción de depuración, es decir: gcc -m32 -O<n> Bomba.c -o bomba Donde n es el nivel de optimización desado, en la práctica solo se permite hasta nivel 2.

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

dev

Por qué un switch es más rápido que su homólogo if-then-else

En este artículo pretendo explicar el motivo por el cual un switch es mucho más rápido que su homólogo en secuencias if-then-else, para ello analizaremos la implementación del switch.

Introducción

El switch se basa en una implementación muy eficiente llamada en inglés jump table o tabla de saltos. Esta tabla es un array, donde la entrada i es la dirección de un segmento de código que implementa la acción que el switch debería ejecutar cuando la condición es igual a i. El código realiza una referencia al array dentro de la tabla de saltos usando el índice del switch y determinar así el destino para una instrucción de salto (instrucción jmp en ensamblador).