Ceci est une ancienne révision du document !
lien pour télécharger l'archive : http://repo.zenk-security.com/ctfs/ndh2k15/mass.tar.gz
Le binaire était packé avec un upx modifié, il suffisait donc de voir le pushad à 0x004460A0, de chercher le popad qui est à 0x00446235 et le tail jump pas très loin (à 0x00446243) qui pointe vers l'OEP : 0x004015A7
On utilise les outils classique LordPE / ImpRec pour avoir une version du binaire unpackée
TODO : Flyingwolf?
J'ai repris le script python de FlyingWolf que j'ai recodé en C et j'y ai rajouté le bruteforce (de manière dégueulasse)
#include <stdio.h> #include <stdlib.h> #include <string.h> #define rol(x,n) ((x << n) | (x >> (32-n))) #define ror(x,n) ((x >> n) | (x << (32-n))) unsigned int hash1(char *str) { int i=0; unsigned int eax = 0xC1AC0FF3; unsigned int edx = 0xBADB0155; for(i=6; i>0; i--) { eax ^= str[i]; eax = rol(eax,7); eax = (eax * edx) & 0xFFFFFFFF; eax = ~eax; eax = (eax * edx) & 0xFFFFFFFF; eax = ror(eax,2); } return eax; } unsigned int hash2(char *str) { int i=0; unsigned int eax = 0x17A5F4CC; unsigned int edx = 0x0B194553; for(i=6; i>0; i--) { eax ^= str[i]; eax = ror(eax, 2); eax = (eax * edx) & 0xFFFFFFFF; eax = ~eax; eax = rol(eax, 7); } return eax; } int main(int argc, char **argv) { char *alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; char str[7]; unsigned int out; int i, j, k, l, m, n, o; str[0] = 'M'; for(j=0; j<strlen(alphabet); j++) { str[1] = alphabet[j]; printf("%c\n", alphabet[j]); for(k=0; k<strlen(alphabet); k++) { str[2] = alphabet[k]; for(l=0; l<strlen(alphabet); l++) { str[3] = alphabet[l]; for(m=0; m<strlen(alphabet); m++) { str[4] = alphabet[m]; for(n=0; n<strlen(alphabet); n++) { str[5] = alphabet[n]; for(o=0; o<strlen(alphabet); o++) { str[6] = alphabet[o]; out = hash1(str); if(out == 0x8AD3629B) printf("FOUND : %s\n", str); }}}}}}; return 0; }
Pour avoir la deuxieme partie du flag, on réutilise le même code mais on remplace out == 0x8AD3629B par 0x25B978C2, str[0] = 'M' par str[0] = 'd' et hash1(str) par hash2(str)
Le problème c'est qu'il y a des collisions, on trouve plusieurs hashes valides. Lorsque l'on valide l'épreuve, un message de félicitation est affiché en allemand et un hint a été donné plus tard par l'équipe de hzv avec aussi une phrase en allemand.
En regardant les différents hashes valides, on s'aperçoit qu'on a deux hashes qui ressemblent à des mots allemands : MeinHan dyKaput
en les concaténant, on valide enfin l'épreuve \o/