Underc0de

[In]Seguridad Informática => Wargames y retos => Soluciones de Wargames => Mensaje iniciado por: rollth en Mayo 30, 2017, 11:26:23 PM

Título: Resolviendo CrackMe con Pipes
Publicado por: rollth en Mayo 30, 2017, 11:26:23 PM
Muy buenas a todos Underc0ders!

Hoy voy a hacer una prueba de concepto de una resolución de un posible Crackme usando Pipes, esta es una "funcionalidad" que nos aportan los sistemas operativos que nos sirve para comunicar varios procesos entre ellos.

Bueno vamos a empezar ejecutando el crackme y viendo que nos responde.

(https://i.gyazo.com/c6e43ba17cadffdbf61b7d5032f9fda1.png)

Como podemos ver no nos pide una respuesta así que supondremos que la contraseña hay que pasarla como valor al iniciar el programa, además parece que la contraseña es en formato numérico, por lo tanto lo que vamos a hacer es un programa en C que a través de Pipes vaya lanzando números hasta que de con la contraseña correcta.

#include <stdio.h>
#include <windows.h>

int prueba(int valor){

// Ruta del programa y otros valores

char programa[100] = "cmd /c \"C:\\Users\\roll_\\Desktop\\CrackMe 1.0.exe\" ";
char numero[10];
itoa(valor ,numero, 10);

strcat(programa, numero);

char respuesta[10024];

// Borro el buffer

memset(respuesta, 0, sizeof(respuesta));

// Atributos necesarios

SECURITY_ATTRIBUTES sa;
STARTUPINFO si;
PROCESS_INFORMATION pi;

// Punteros de lectura y escritura

void * lectura;
void * escritura;

// Creamos pipe e iniciamos el proceso

sa.bInheritHandle = TRUE;

CreatePipe(&lectura, &escritura, &sa, 0);

si.dwFlags = STARTF_USESTDHANDLES;
si.hStdOutput = escritura;
si.hStdError = escritura;
si.hStdInput = lectura;

CreateProcessA(0, programa, 0, 0, TRUE, 0, 0, 0, &si, &pi);;

// Comprobamos si se ha acertado

ReadFile(lectura, respuesta, 10024, 0, 0);

if(strcmp(respuesta, "Password Incorrecta") != 0 && strcmp(respuesta, ("Introducir valor numerico"))){
printf("%s %d\n", respuesta, valor);
return 1;
}
printf("%s %d\n", respuesta, valor);
return 0;

}

int main(){

// Bucle para hacer la prueba

int i = 0;

while(prueba(i) != 1){

i++;

}

Sleep(100000);

}


Tras ejecutar el programa veremos que en pocos segundos nos sacará la contaseña.

(https://i.gyazo.com/be1efe33907ed03f1fe98bc3a1449816.png)

Es un concepto sencillo pero creo que puede ser interesante, se podría ampliar más pero creo que queda claro el concepto.

Por último dejo el código del crackme :D

#include <stdio.h>

int main(int argc, char *argv[]){

int password2;
int password = 725;

password2 = atoi(argv[1]);

if (password2 == 0){
printf("Introducir valor numerico");
}
else if(password == password2){
printf("Password Correcta");
}
else{
printf("Password Incorrecta");
}

}



También me pueden seguir en Twitter si les hace ilusión: @RoloMijan (https://twitter.com/RoloMijan)

Saludos.


Título: Re:Resolviendo CrackMe con Pipes
Publicado por: blackdrake en Junio 30, 2017, 04:51:31 PM
La fuerza bruta a veces es la solución de muchos problemas :D

Gran aporte Rolo, seguro que a muchos les sirve

Un saludo