2012/12/16

[Write-up] PHDays CTF (Quals) Bin100

Me revoilà!!

Après tant d'absence non, je ne suis pas mort !
Plutôt pas mal occupé sur Toulouse ou je bosse désormais mais jamais bien loin du monde de la sécu ;-) !

Ainsi, je me suis pas mal remis aux CTF depuis peu avec mes confères d'ou ce petit post de "reprise d'activité" du blog .

Bon, je me suis pas foulé sur ce coup, je le reconnais mais je commence à avoir des idées d'articles qui germent dans ma 'tite tête alors en attendant voici un petit writeup des plus simple mais bon...
Comme souvent ici il est question de R.E.

Le CTF était de type "Jeopardy" : il fallait DL les challenges sur l'adresse quals.phdays.com puis POUTRER !

Je me suis donc dis que les catégories Bin et Pwn étaient pour moi .
Cela dis, j'ai jeter un oeil ailleurs aussi, forcément.. C'était plutôt pas mal avec de l'audit de source  PHP et requêtes SQL (voir en fin d'article) en passant par un puzzle à résoudre ou encore du R.E avancé sous Bochs, bref, du pur bonheur !!

Bon, passons au sujet traité ici: le bin100:
On DL une archive .zip, un petit unzip dessus et on se retrouve avec un binaire "discret" appelé simplement .exe que j'ai rapidement renommé bin1.exe.

En premier lieu je lance la bête afin de le voir à l'oeuvre et de prendre en compte les éventuels outputs renvoyés:


A partir de la j'ai tout naturellement sortie Ida et me suis dis "oups ": à la seule vue du code ASM on pige direct qu'il y a un packer la dessous alors.. PeID !
Ouf, fausse alerte enfin, si , packé mais un simple UPX donc upx -d bin1.exe, on check et ok, unpacked.
A partir de la c'est du classique on lance notre désassembleur préféré HT \o/ :


Ok de la on a notre EP (Entry Point) donc ne fait plus que suivre à partir de l'adresse ou le binaire "jumpe" puis on regarde attentivement le code ASM en réalisant un dump ou encore avec un arbre des appels de fonctions, ce que fait très bien IdaPro:


Bon donc la c'est carrément easy, si vous etes des assidus de mon blog vous devriez savoir ce qu'il reste à faire..non?

Simple pourtant ! On vois clairement les conditions à bypasser afin de tomber sur le "Get_your_flag" (explicite n'est-ce pas) ce que nous allons d'ailleurs faire immédiatement car le but est de valider un flag hein ;-) .
On va donc faire comme tout bon newbie et venir transformer nos JZ en JNZ, chmoder le binaire (+x) et voir si notre intuition est la bonne auquel cas on aura poutrer ce premier challenge en 2 minutes chrono !!

Les modifications apportées ( je ne reviendrai pas sur le comment car tout est expliquer ailleurs sur mon blog), voici ce que l'on obtiens sous HTeditor:


Ou sous Ida avec un beau graphe de fonctions:


So, à présent exécutons notre binaire modifier pour vérifier tout cela..


Oh ben ça alors, un flag, plus qu'a utiliser quelque xor (vu dans les fonctions précédentes) afin d'en générer un md5 pour la validation, phase que je ne détaillerai hélas pas ici par manque de temps et je m'en excuse car c'est bien la le nerf de la guerre :S ...

Ceci dit je me réserve plutot pour les writeups du CTF de la semaine à venir: 29C3   !!

Voila pour ce petit writeup de rappel, incomplet, je le regrette mais il faut l'avouer, il était simple: un UPX -d et 2 \x75 c'est quand même pas violent aprés un petit calcul à faire et hop!
Mais au moins ça m'aura permis de rédiger ce petit article qui, je le reconnais me donne envie de revenir rapidement en réécrire d'autre beaucoup plus technique alors .. A très vite !!

kmkz

Liste des writeups diponibles


RealWorld100 (php/sql)
RealWorld500
Pwn300
Misc100
Misc400(code)
Misc200(Deutch)