Nuit Du Hack 2018 – Solutions challenges stand Devoteam

Azmi Sbai Conférences, Writeups

Devoteam était sponsor Platinum de la Nuit du Hack 2018 qui s’est déroulée du 30 Juin au 1 Juillet 2018 à la cité des sciences et de l’industrie à Paris.

Afin d’animer le stand, Devoteam a proposé deux challenges pour les participants: le premier challenge de reverse (crackme: difficulté moyenne) et le deuxième un challenge de cryptographie sur papier (facile).

Cet article présente les solutions pour les deux challenges, que nous avons créés pour l’occasion. Tout retour constructif sur ces épreuves est le bienvenu.

 

CrackMe

Voici le code source de l’épreuve:

#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>

#define NUM_OF_CORES 8
#define MAX_PRIME 100000

/*junk function*/

void do_primes()
{
    unsigned long i, num, primes = 0;
    for (num = 1; num <= MAX_PRIME; ++num) {
        for (i = 2; (i <= num) && (num % i != 0); ++i);
        if (i == num)
            ++primes;
    }
}

int main(int argc, char** argv)
{
            int j=0; //compteur
            char bad[] = "sorry, it's not the solution";

/*++Junkcode1============================================*/
            time_t start, end;
            time_t run_time;
            unsigned long i;
            pid_t pids[NUM_OF_CORES];

            start = time(NULL);
            for (i = 0; i < NUM_OF_CORES; ++i) {
            if (!(pids[i] = fork())) {
                do_primes();
                exit(0);
            }
            if (pids[i] < 0) {
                perror("Fork");
                exit(1);
            }
            }
            for (i = 0; i < NUM_OF_CORES; ++i) {
            waitpid(pids[i], NULL, 0);
            }
         end = time(NULL);
         run_time = (end - start);
/*--Junkcode1==============================================*/
            char congrat[] = "Well done!";

/*++Junkcode2============================================*/

            char kent[16] = "";
            char * s="aaa&method=get&name=ccc&test=aaa";
            char *a, *b, *p, *q;
            a =strchr(s,'&');
            b =strchr(s,'=');
            p= strstr(s,"name=");
            q= strstr(p,"&");
            /*--Junkcode2============================================*/

            /*boucle de comparaison*/
            for(j=0; i < (strlen(congrat) -1); i++)
            {
                        if(argv[2][j] != congrat[j] || strlen(argv[2]) != strlen(congrat))
                        {
                                    printf(bad);
                                    exit(0);
                        }                   

            }          
            printf(congrat);
            return 0;         
}

Ce code a été compilé sur Linux  64 bits (Base Debian) avec la commande suivante:

gcc -Wall -m32 -s -fstack-protector chall_junk.c -o CrackMeDevoteamNDH2K18

La difficulté ici était de suivre l’exécution du binaire malgré le code poubelle. Une fois le code retiré, il nous reste le code suivant:

#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>

#define NUM_OF_CORES 8
#define MAX_PRIME 100000

int main(int argc, char** argv)
{
            int j=0; //compteur
            char bad[] = "sorry, it's not the solution";
            char congrat[] = "Well done!";           
            for(j=0; i < (strlen(congrat) -1); i++)
            {
                        if(argv[2][j] != congrat[j] || strlen(argv[2]) != strlen(congrat))
                        {
                                    printf(bad);
                                    exit(0);
                        }                     
            }
            printf(congrat);
            return 0;          
}

On peut donc voir qu’il s’agit d’une boucle de comparaison, la solution était donc la string  » Well done ».

 

Challenge Crypto

Un texte chiffré a été donné au participants, le mot de validation du challenge est la concaténation des premières lettres de chaque ligne du message en clair (après déchiffrement).

Voici le message chiffré:

afdfqxip qoxkpclojxhbop
bumboqfpb axkp mirpfbrop aljxfkbp : clobkpfzp, zovmqlildfb, flq
slrp slribw cxfob mxoqfb ab i’bnrfmb xrafq ?
lk mbrq slrp molmlpbo rk bkqobqfbk
zebw klrp ix mofkzfmxib xzqfsfqb bpq ix
obxifpxqflk a’xrafq ab pbzrofqb xsbz rkb jxglofqb ab qbpqp a’fkqorpflk
vlr zxk xipl cfka fk lro qbxj
molgbqp ab obzebozeb bq absbilmmbjbkq
qoxsxfi bk bnrfmb

Le message était chiffré avec une méthode de chiffrement classique « Cesar ». La difficulté était de retrouver le bon nombre de décalage afin de déchiffrer le texte. Le nombre de Cesar qui représente le décalage de lettres par rapport à l’alphabet était 23 (que l’on appelle « ROT 23 », ROT équivalent à dire Rotation).

Le message en clair après déchiffrement:

Digitals transformakers
Expertise dans plusieurs domaines : forensics, cryptologie, iot
Vous voulez faire partie de l’equipe audit ?
On peut vous proposer un entretien
Chez nous la principale activite est la
Realisation d’audit de securite avec une majorite de tests d’intrusion
You can also find in our team
Projets de recherche et developpement
Travail en equipe

Le mot de validation est donc: « Devocrypt ».

 

Retrouvez Devoteam aux prochaines conférences de sécurité pour de nouveaux challenges sur stand,

L’équipe audit de Devoteam