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.