Outils d'utilisateurs

Outils du Site


ndhquals2015:mass_surveillance_software

Ceci est une ancienne révision du document !


Mass Surveillance Software

Unpack

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

Analyse

TODO : Flyingwolf?

Code de résolution

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 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!"; 
	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/

ndhquals2015/mass_surveillance_software.1428242905.txt.gz · Dernière modification: 2017/04/09 15:33 (modification externe)