Skip to content

Commit 0e0eb76

Browse files
committed
update inject images
2 parents 21cdfce + 121ff4f commit 0e0eb76

File tree

1 file changed

+25
-25
lines changed

1 file changed

+25
-25
lines changed

Human.old-WriteUp.md

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,22 @@
33
## Informations :<br><br>
44
**Challenge** : Human.old<br>
55
**Description** : M0th3r > Bravo, grâce à toi, on a enfin sauvé Duke. C'est le moment de voir sa BaseLine. Qui se cachait réellement derrière Duke-083<br>
6-
**Points** : 500
7-
**Solves** : 1
6+
**Points** : 500<br>
7+
**Solves** : 1<br>
88
**Contributeur** : Lexsek<br>
99

1010
## Solutions :<br><br>
1111

12-
### Reconnaissance :
12+
### Premiers pas :
1313
On obtient un executable windows de type PE32 :<br><br>
14-
![alt text](https://github.com/Lexsek/SecurityDay2019/blob/master/images/file_pe32.png "file ReverseHub.exe")<br><br>
15-
![alt text](https://github.com/Lexsek/SecurityDay2019/blob/master/images/icone.png "icone ReverseHub.exe")<br><br>
14+
![alt text](https://github.com/Lexsek/CTFSecurityDay2019/blob/master/images/file_pe32.png "file ReverseHub.exe")<br><br>
15+
![alt text](https://github.com/Lexsek/CTFSecurityDay2019/blob/master/images/icone.png "icone ReverseHub.exe")<br><br>
1616

1717
Lorsqu'on le charge dans IDA, un message apparait concernant l'IAT (Import Address Table) :<br><br>
18-
![alt text](https://github.com/Lexsek/SecurityDay2019/blob/master/images/packed_iat.png "iat ReverseHub.exe")<br><br>
18+
![alt text](https://github.com/Lexsek/CTFSecurityDay2019/blob/master/images/packed_iat.png "iat ReverseHub.exe")<br><br>
1919
IDA n'arrive dont pas à trouver la table des imports, ce qui veut dire que notre executable est vraisemblablement packé.<br>
2020
Celui ci n'est rien d'autre que UPX, mais les signatures sembles avoir été supprimés à la main afin de nous empêcher d'utiliser la commande upx -d afin de le dépacker.<br><br>
21-
![alt text](https://github.com/Lexsek/SecurityDay2019/blob/master/images/hexedit.png "hexedit ReverseHub.exe")<br><br>
21+
![alt text](https://github.com/Lexsek/CTFSecurityDay2019/blob/master/images/hexedit.png "hexedit ReverseHub.exe")<br><br>
2222
**Comment fonctionne un packer et plus particulièrement UPX ?**<br><br>
2323
Les packers sont des utilitaires dont le travail consiste à compresser un programme executable et à le chiffrer afin d'en générer un nouveau. Ce nouvel executable contiendra en fait l'original comme de la donnée, ainsi qu'une routine d'unpacking qui sera appelée. Ils sont principalement utilisés dans les cas de protection logicielle ou de malwares afin d'en complexifier l'analyse.<br><br>
2424
Lorsque l'on est face à un programme packé, le routine d'unpack effectue les actions suivantes :<br>
@@ -29,37 +29,37 @@ La table des imports correspond en fait sorte d'index qui va indiquer les DLL et
2929

3030
**Etudions donc le comportement d'unpack d'UPX :**<br><br>
3131
Executable original, toutes les sections et les entêtes PE sont visibles et le point d'entré commence à l'original entry point <br>
32-
![alt text](https://github.com/Lexsek/SecurityDay2019/blob/master/images/upx1.png "upx1 ReverseHub.exe")<br><br>
32+
![alt text](https://github.com/Lexsek/CTFSecurityDay2019/blob/master/images/upx1.png "upx1 ReverseHub.exe")<br><br>
3333
Executable packé, la routine d'unpack est ajouté, et le point d'entré pointe maintenant sur la routine d'unpack<br>
34-
![alt text](https://github.com/Lexsek/SecurityDay2019/blob/master/images/upx2.png "upx2 ReverseHub.exe")<br><br>
34+
![alt text](https://github.com/Lexsek/CTFSecurityDay2019/blob/master/images/upx2.png "upx2 ReverseHub.exe")<br><br>
3535
Après le chargement en mémoire, la routine d'unpack déchiffre et décompresse le programme original<br>
36-
![alt text](https://github.com/Lexsek/SecurityDay2019/blob/master/images/upx3.png "upx3 ReverseHub.exe")<br><br>
36+
![alt text](https://github.com/Lexsek/CTFSecurityDay2019/blob/master/images/upx3.png "upx3 ReverseHub.exe")<br><br>
3737
Après l'unpack total, la table des imports est maintenant résolue, le point d'entrée pointe maintenant vers l'orginial entry point du program original.<br>
38-
![alt text](https://github.com/Lexsek/SecurityDay2019/blob/master/images/upx4.png "upx4 ReverseHub.exe")<br><br>
38+
![alt text](https://github.com/Lexsek/CTFSecurityDay2019/blob/master/images/upx4.png "upx4 ReverseHub.exe")<br><br>
3939
### Unpacking
4040

4141
Dans IDA, nous allons le faire rapidement en dynamique:
4242

4343
**Phase 1:**<br>
4444
Breaker sur l'instruction de jmp du block rouge en bas du graph<br><br>
45-
![alt text](https://github.com/Lexsek/SecurityDay2019/blob/master/images/1stunapckred.png "unpack1 ReverseHub.exe")<br><br>
45+
![alt text](https://github.com/Lexsek/CTFSecurityDay2019/blob/master/images/1stunapckred.png "unpack1 ReverseHub.exe")<br><br>
4646
**Phase 2:**<br>
4747
Breaker sur la nouvelle instruction de jmp après le nouveau block apparu<br><br>
48-
![alt text](https://github.com/Lexsek/SecurityDay2019/blob/master/images/2ndunpack.png "unpack2 ReverseHub.exe")<br><br>
48+
![alt text](https://github.com/Lexsek/CTFSecurityDay2019/blob/master/images/2ndunpack.png "unpack2 ReverseHub.exe")<br><br>
4949
**Phase 3:**<br>
5050
Aller jusqu'au bloc vert<br><br>
51-
![alt text](https://github.com/Lexsek/SecurityDay2019/blob/master/images/3rdpack.png "unpack3 ReverseHub.exe")<br><br>
51+
![alt text](https://github.com/Lexsek/CTFSecurityDay2019/blob/master/images/3rdpack.png "unpack3 ReverseHub.exe")<br><br>
5252
**Phase 4:**<br>
5353
Breaker sur le call dans le block vert, juste après le mov de \[esi\]<br><br>
54-
![alt text](https://github.com/Lexsek/SecurityDay2019/blob/master/images/b3rd.png "unpack4 ReverseHub.exe")<br><br>
54+
![alt text](https://github.com/Lexsek/CTFSecurityDay2019/blob/master/images/b3rd.png "unpack4 ReverseHub.exe")<br><br>
5555
Ce call correspond en fait a l'entry point de l'executable original, nous allons donc dumper le disque afin de faire une analyse statique du reste du programme.<br>
5656
Notre binaire commence à l'adresse **0x011F3710**, cette adresse est situé dans le segment 20. Nous allons donc dumper proprement ce segment à l'aide d'un script python IDA, mais il faudra au préalable calculer sa taille.<br><br>
57-
![alt text](https://github.com/Lexsek/SecurityDay2019/blob/master/images/segment.png "segment ReverseHub.exe")<br><br>
57+
![alt text](https://github.com/Lexsek/CTFSecurityDay2019/blob/master/images/segment.png "segment ReverseHub.exe")<br><br>
5858
* Fin du segment : **0x1247000**<br>
5959
* Début du segment : **0x11F1000**<br>
6060
* Taille du segment : **0x56000**<br><br>
6161
Voici à quoi ressemble notre script :<br><br>
62-
![alt text](https://github.com/Lexsek/SecurityDay2019/blob/master/images/reverhubunpack.png "pythonida ReverseHub.exe")<br><br>
62+
![alt text](https://github.com/Lexsek/CTFSecurityDay2019/blob/master/images/reverhubunpack.png "pythonida ReverseHub.exe")<br><br>
6363

6464
### Analyse statique du binaire:
6565
Une fois dumpé on met le dump dans IDA.<br>
@@ -69,15 +69,15 @@ Il va falloir retrouver l'adresse de notre fonction main avec ce calcul :<br>
6969
* Base adress du main : **0x2710**<br><br>
7070

7171
Notre fonction main correspond donc au **sub_2710**<br><br>
72-
![alt text](https://github.com/Lexsek/SecurityDay2019/blob/master/images/sub2710_dump.png "sub_2710 ReverseHub.exe")<br><br>
72+
![alt text](https://github.com/Lexsek/CTFSecurityDay2019/blob/master/images/sub2710_dump.png "sub_2710 ReverseHub.exe")<br><br>
7373
Bref survol du main :<br><br>
74-
![alt text](https://github.com/Lexsek/SecurityDay2019/blob/master/images/main.png "ida ReverseHub.exe")<br><br>
74+
![alt text](https://github.com/Lexsek/CTFSecurityDay2019/blob/master/images/main.png "ida ReverseHub.exe")<br><br>
7575
On a :<br>
7676
* Plusieurs appels de fonctions<br>
7777
* Une comparaison qui peut nous faire jumper ou non plus bas dans le binaire<br>
7878
* De multiples comparaison de var_2C avec des integers<br><br>
7979

80-
![alt text](https://github.com/Lexsek/SecurityDay2019/blob/master/images/comparaison_var_2c.png "var_2C ReverseHub.exe")<br><br>
80+
![alt text](https://github.com/Lexsek/CTFSecurityDay2019/blob/master/images/comparaison_var_2c.png "var_2C ReverseHub.exe")<br><br>
8181

8282
Les apppels de fonctions correspondent pour la plupart à des antidebugs et antivm et antisandbox, ou du trolling :<br>
8383
* Changement de fond d'écran après avoir chargé une image depuis les ressources<br>
@@ -90,24 +90,24 @@ Les apppels de fonctions correspondent pour la plupart à des antidebugs et anti
9090
* Création d'un fichier troll avec de la base64 inutile<br>
9191
* Vérification du mouvement de la souris<br><br>
9292

93-
![alt text](https://github.com/Lexsek/SecurityDay2019/blob/master/images/prog1.png "antistuff ReverseHub.exe")<br><br>
93+
![alt text](https://github.com/Lexsek/CTFSecurityDay2019/blob/master/images/prog1.png "antistuff ReverseHub.exe")<br><br>
9494

9595
La variable var_2C servait en fait de compteur pour vérifier si l'on s'était fait detecter par les fonctions d'anti VM / DEBUG / SANDBOX, et elle était incrémentée de 1 juste avant d'arriver sur les comparaisons avec les integers.<br><br>
9696

97-
![alt text](https://github.com/Lexsek/SecurityDay2019/blob/master/images/prog2.png "antistuff2 ReverseHub.exe")<br><br>
97+
![alt text](https://github.com/Lexsek/CTFSecurityDay2019/blob/master/images/prog2.png "antistuff2 ReverseHub.exe")<br><br>
9898

9999
Le programme vérifier ensuite si argc était > à 1, si ce n'était pas le cas, il récupérait son chemin de lancement, et en fonction du compteur var_2C, il se relançait avec une option.<br><br>
100100

101-
![alt text](https://github.com/Lexsek/SecurityDay2019/blob/master/images/prog3.png "antistuff3 ReverseHub.exe")<br><br>
101+
![alt text](https://github.com/Lexsek/CTFSecurityDay2019/blob/master/images/prog3.png "antistuff3 ReverseHub.exe")<br><br>
102102

103103
Certaines de ces options étaient destructrices, le programme faisait un CALL $5, POP EBX afin de récupérer l'eip dans EBX, et il xorait EBX avec une valeur en dur avant de sauter dessus, evidemment l'adresse obtenue n'était pas valide.<br>
104104
Pour les autres options, si l'on suit la logique de notre programme, **notre compteur si l'on est pas détecter doit valoir 1** pendant les comparaisons, le **bon argument est donc --3333**.
105105

106106
Si l'on regarde donc ce qu'il se passe avec les comparaisons d'arguments, c'est comme pour les comparaisons du compteur, une vérification se produit et une fonction est appelée que j'ai renommé "CreateCalcAndInject**Right|Wrong**Shellcode.<br>
107107
En effet, le seul est unique bon paramètre étant --3333, les autres appels font une destructions de l'EIP, où injecte un shellcode ou une routine invalide dans calc.exe.
108108

109-
![alt text](https://github.com/Lexsek/SecurityDay2019/blob/master/images/prog4.png "antistuff4 ReverseHub.exe")<br><br>
110-
![alt text](https://github.com/Lexsek/SecurityDay2019/blob/master/images/prog5.png "antistuff5 ReverseHub.exe")<br><br>
109+
![alt text](https://github.com/Lexsek/CTFSecurityDay2019/blob/master/images/prog4.png "antistuff4 ReverseHub.exe")<br><br>
110+
![alt text](https://github.com/Lexsek/CTFSecurityDay2019/blob/master/images/prog5.png "antistuff5 ReverseHub.exe")<br><br>
111111

112112
### Analyse de l'injection
113113

0 commit comments

Comments
 (0)