Un petit crackme pour continuer dans cette série de write-up sur la NDH2k12.
Bukkake = je vous laisse aller voir sur google …
1. What
On a un exécutable ELF qui nous demande d’entrer un mot de passe !
IDA va nous en dire plus …
Au début on vérifie juste qu’il y a bien un argument sinon on sort …
L’argument est passer ensuite à la fonction check.
2. Check
Dans cette fonction, on va appeler « WhatisIt » qui va générer un hash de notre mot de passe,
puis ce hash sera comparé avec un « bon » hash codé en dur dans le programme.
puis ce hash sera comparé avec un « bon » hash codé en dur dans le programme.
La fonction « ccc » sert juste à comparer. Il reste à voir comment le hash est généré.
Un coup de Hexray + nettoyage plus tard, on obtient :
Un coup de Hexray + nettoyage plus tard, on obtient :
int whatisit(int* buffer, char* password){
int pos = 0;
int result = 0;
int i, j, k;
for ( i = 0; i <= 31; ++i )
{
for ( j = 0; j <= 35; ++j )
{
result = *(hash1 + j);
if ( password[i] == result )
{
for ( k = 0; k <= 35; ++k )
{
result = *(hash2 + k);
if ( result == j )
{
result = buffer[pos];
buffer[pos++] = k + 3;
}
}
}
}
}
return result;
}
int pos = 0;
int result = 0;
int i, j, k;
for ( i = 0; i <= 31; ++i )
{
for ( j = 0; j <= 35; ++j )
{
result = *(hash1 + j);
if ( password[i] == result )
{
for ( k = 0; k <= 35; ++k )
{
result = *(hash2 + k);
if ( result == j )
{
result = buffer[pos];
buffer[pos++] = k + 3;
}
}
}
}
}
return result;
}
Hash1 et hash2 sont 2 tableaux dont on connait les valeurs (codées en dur).
En fait l’algo est simple, pour chaque caractère, on cherche où il est dans hash1
et on garde l’index. On fait de même pour hash2 avec l’index trouvée précédemment.
et on garde l’index. On fait de même pour hash2 avec l’index trouvée précédemment.
Du coup, on peut facilement faire l’inverse :
on sait que k = caractère_chiffré – 3, puis j = hash2[k] et le caractère_clair = hash1[j].
Ce qui donne le petit programme en C suivant :
#include <stdio.h>
#include <string.h>
int goodHash[] = { 3, 35, 31, 35, 5, 3, 8, 7, 31, 4,
5, 32, 33, 7, 31, 5, 33, 5, 4, 29,
34, 30, 31, 38, 37, 31, 30, 33, 36, 6,
36, 37};
int hash1[] = {90, 67, 88, 74, 89, 82, 79, 73, 72, 66,
65, 86, 78, 71, 75, 84, 68, 76, 85, 69,
83, 80, 77, 70, 87, 81, 48, 49, 50, 51,
52, 53, 54, 55, 56, 57};
int hash2[] = {10, 9, 1, 16, 19, 23, 13, 8, 7, 3,
14, 17, 22, 12, 6, 21, 25, 5, 20, 15,
18, 11, 24, 2, 4, 0, 26, 27, 28, 29,
30, 31, 32, 33, 34, 35, 36};
int main(void){
char buffer[100];
int i, idx = 0;
for ( i = 0; i <= 31; ++i ){
int k = goodHash[i] - 3;
int j = hash2[k];
buffer[idx++] = hash1[j];
}
buffer[idx++] = '\0';
printf("%s\n", buffer);
}
#include <string.h>
int goodHash[] = { 3, 35, 31, 35, 5, 3, 8, 7, 31, 4,
5, 32, 33, 7, 31, 5, 33, 5, 4, 29,
34, 30, 31, 38, 37, 31, 30, 33, 36, 6,
36, 37};
int hash1[] = {90, 67, 88, 74, 89, 82, 79, 73, 72, 66,
65, 86, 78, 71, 75, 84, 68, 76, 85, 69,
83, 80, 77, 70, 87, 81, 48, 49, 50, 51,
52, 53, 54, 55, 56, 57};
int hash2[] = {10, 9, 1, 16, 19, 23, 13, 8, 7, 3,
14, 17, 22, 12, 6, 21, 25, 5, 20, 15,
18, 11, 24, 2, 4, 0, 26, 27, 28, 29,
30, 31, 32, 33, 34, 35, 36};
int main(void){
char buffer[100];
int i, idx = 0;
for ( i = 0; i <= 31; ++i ){
int k = goodHash[i] - 3;
int j = hash2[k];
buffer[idx++] = hash1[j];
}
buffer[idx++] = '\0';
printf("%s\n", buffer);
}
3. Résultat
On obtient le hash suivant : A626CAFE2BC34E2C4CB0512982147D78
Aucun commentaire:
Enregistrer un commentaire