|
Ouaip, heu !
Salut…
Dis, comment qu'on peut faire pour cracker 3D Exploration ?
Aller sur Astalavista ?
Ouaip, non, hé !
Moi ce que je veux c'est apprendre comment qu'y faut faire…
Motivé, hein ?
Bon, imaginons que la cible soit malade…
Par quoi faudrait il commencer…
Heu, ben…
Aller voir un toubib ?
C'est toi le toubib !
Heu, éditer les faire-parts de décès ?
Un peu radical !
On peut pas lui laisser une chance de guérir, à ton programme ?
Ben, alors on regarde ce qui va pas…
C'est parti !
La phase Diagnostic :
Prenons la température du patient:
Infection :
UNREGISTERED
dans le bandeau d 'écran
Un item REGISTER dans le
menu HELP, et
UNREGISTERED VERSION
Please register your personal copy.
Dans la boite About
Ca pourrait être une poussée d'urticaire…
Classique, en somme…
Voyons du coté de la boite d'enregistrement.
Dites Haaaaaaaaa !
Mais, mais, mais….
Je vois une tâche, là….
Le bouton " REGISTER " est grisé.
Essayons un truc simple :
Remplir l'unique champ de la boite d'enregistrement par un sérial, en espérant que le bouton va se
dégriser…
Bon, fausse alerte !
Au onzième caractères, le bouton devient actif.
On valide, et
|
3D Exploration must be rebooted to check some key data.
Please restart 3D Exploration.
|
Fâcheux comme réaction !
Une recherche de serial (serial fishing) risque de poser un soupçon de difficulté…
Passons le malade au spectromètre :
Pas Glop ! Pas Glop !
Wdasm plante !
Mais en fait, c'est qu'il aurait peut être bien une chtouille carabinée, votre malade…
Utilisons un scanner
ProcDump by G-RoM, Lorian et Stone :
.text 0006C000 00001000 0002C600 00000600 C0000040
.data 0000D000 0006D000 00002E00 0002CC00 C0000040
.tls 00001000 0007A000 00000200 0002FA00 C0000040
.rdata 00001000 0007B000 00000200 0002FC00 C0000040
.idata 00003000 0007C000 00000C00 0002FE00 C0000040
.edata 00001000 0007F000 00000400 00030A00 C0000040
.reloc 00004000 000E1000 00000000 00046000 C0000040
.aspr 0001F000 000E5000 0001EC00 00046000 C0000040
.rsrc 00001000 00104000 00000000 00064C00 C0000040
|
Oula !
Mais c'est qu'il est pas en forme ce programme :
Toutes les sections sont à C000040, et une section .aspr est présente.
Ca m'a tout l'air d'une attaque ASPackienne aiguë, ce truc…
Et bien, on va commencer par opérer en douceur, en manuel
La phase Curative:
A l'aide de ProcInfo, by TeeJi, on va modifier les caractéristiques de la première section :
Name
VirtuaI Size
VirtuaI Address
Size Of Raw Data
Pointer To Raw Data
Pointer To Relocation
Pointer To Linenumber
Number Of Relocations
Number Of Linenumbers
Characterstics |
.text
0006C000
00001000
0002C600
00000600
03E4B1FD
03E4B20B
B219
03E4
E0000020 |
Après cette petite anesthésie locale, voyons ce qu'on va découvrir
:
:004E5001 60 PUSHAD
:004E5002 E801000000 CALL 004E5008
:004E5007 90 NOP
:004E5008 5D POP EBP
Une classique entrée de programme packé. Rien d'alarmant pour le
moment.
Rassurez la famille !
En avançant pas à pas, (infirmière, passez-moi F10) :
|
3D Exploration File corrupted !
|
Ouch !
Tension les gars, va nous faire un arrêt cardiaque !
Bene !
Le prog à un CRC.
Méchante chose ça.
Très contagieux en ce moment qui plus est !
En va enlever la tumeur, mais pour commencer, voyons si l'infection est généralisée :
BPX GetProcAddress :
Glop !
Droit dessus
:BFF70000 4D 5A 90 00 03 00 00 00-04 00 00 00 FF FF 00 00 MZ..............
:BFF70010 B8 00 00 00 00 00 00 00-40 00 00 00 00 00 00 00 ........@.......
:BFF70020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
:BFF70030 00 00 00 00 00 00 00 00-00 00 00 00 80 00 00 00 ................
:BFF70040 0E 1F BA 0E 00 B4 09 CD-21 B8 01 4C CD 21 54 68 ........!..L.!Th
:BFF70050 69 73 20 70 72 6F 67 72-61 6D 20 63 61 6E 6E 6F is program canno
:BFF70060 74 20 62 65 20 72 75 6E-20 69 6E 20 44 4F 53 20 t be run in DOS
:BFF70070 6D 6F 64 65 2E 0D 0D 0A-24 00 00 00 00 00 00 00 mode....$.......
L'infection part de l'entête du Header (l'adresse 00400000 du programme dont
le contenu a été chargé en BFF70000)
En cherchant quelques lignes plus bas, on repère vite la section .text dont les caractéristiques ont été modifiées :
:BFF701A0 2E 74 65 78 74 00 00 00-05 C9 04 00 00 90 00 00 .text...........
:BFF701B0 00 D0 04 00 00 90 00 00-00 00 00 00 00 00 00 00 ................
:BFF701C0 00 00 00 00 20 00 00 60-5F 49 4E 49 54 00 00 00 .... ..`_INIT...
:BFF701C0 00 00 00 00 20 00 00 60-5F 49 4E 49 54 00 00 00 .... ..`_INIT...
Histoire de voir si le CRC a infecté l'ensemble des tissus, une petite modification
dans les codes du programme (une version " saine "), va démontrer que seul le header est atteint.
C'est un moindre mal.
En sortant de l'API GetProcAddress, un " d edx " va donner :
:004E5B9E 56 69 72 74 75 61 6C 46-72 65 65 00 56 69 72 74 VirtualFree.Virt
:004E5BAE 75 61 6C 50 72 6F 74 65-63 74 00 45 78 69 74 50 ualProtect.ExitP
:004E5BBE 72 6F 63 65 73 73 00 00-00 00 00 75 73 65 72 33 rocess.....user3
:004E5BCE 32 2E 64 6C 6C 00 4D 65-73 73 61 67 65 42 6F 78 2.dll.MessageBox
:004E5BDE 41 00 77 73 70 72 69 6E-74 66 41 00 4C 4F 41 44 A.wsprintfA.LOAD
:004E5BEE 45 52 20 45 52 52 4F 52-00 54 68 65 20 70 72 6F ER ERROR.The pro
:004E5BFE 63 65 64 75 72 65 20 65-6E 74 72 79 20 70 6F 69 cedure entry poi
:004E5C0E 6E 74 20 25 73 20 63 6F-75 6C 64 20 6E 6F 74 20 nt %s could not
Gasp !
Serait ce l'obscure éventualité d'une autre tumeur au niveau de l'Import table ?
Il va falloir opérer dans le vif, et pour commencer trouver le call gérant le CRC et affichant la
MessageBoxA "3D Exploration File corrupted ! ", puis envoyant vers un ExitProcess.
Mieux vaut prévenir la famille que le malade est entre la vie et la mort…
Berck !
Du CCA...
Saleté de code polymorphe !
Infirmière, passez-moi F8, il va falloir tracer dans tous les call, hormis les call [registre+adresse]
Le premier relais est passé en EntryPoint+4DC
:004E54DF 6801F0BF00 PUSH 00BFF001
:004E54E4 C3 RET
Et là, brusque changement.
Le virus s'installe ailleurs...
Bye bye les adresses 004EXXXX, on descend en 00BFF001.
Et bien baptisons ce 00BFF001, ce sera l'EP2
Le relais suivant est en 00BFF5D0 (EP2+5D4)
:00BFF5C5 61 POPAD
:00BFF5C6 7508 JNZ 00BFF5D0
:00BFF5C8 B801000000 MOV EAX,00000001
:00BFF5CD C20C00 RET 000C
:00BFF5D0 680814BF00 PUSH 00BF1408
:00BFF5D5 C3 RET
En cherchant un peu à partir de cette adresse, le call MessageBoxA/ExitProcess
est en :
:00BF06B5 E816F9FFFF CALL 00BEFFD0 > cochonnerie here !
:00BF06BA 8B45F8 MOV EAX,[EBP-08]
:00BF06BD E85A22FFFF CALL 00BE291C0
Petite ablation discrète, on place un RET à l'entrée du call
en question.
Le CRC est OUT !
Glop ! Glop !
Et on part à la recherche du passage vers l'OEP:
En traçant gentiment dans le code, le programme se lance en passant sur le call suivant :
:00BF0B3F E880F9FFFF CALL 00BF04C4 > here
:00BF0B44 5F POP EDI > ressemble pas un
:00BF0B45 5E POP ESI > une espèce de
:00BF0B46 5B POP EBX > POPAD,
:00BF0B47 59 POP ECX > ca ?
:00BF0B48 59 POP ECX
:00BF0B49 5D POP EBP
:00BF0B4A C20400 RET 0004
Dans le call en question, on trouve vite la dernière bébête
à éradiquer :
:00BF04E2 61 POPAD
:00BF04E3 EB01 JMP 00BF04E6
:00BF04E5 E850EB02E9 CALL E9C1F03A
:00BF04EA 17 POP SS
:00BF04EB C3 RET
Avec EAX egal à un Entry Point Classique : 00401000
Voilà de quoi être sur que l'opération va réussir
Il ne reste plus qu'à changer le ret par un jmp EIP, et faire un Dump Full avec ProcInfo (by TeeJi), puis
à remplacer l'OEP :
|
Entry Point
|
00001000
|
Image Base
|
00400000
|
L'opération a réussi :
Le dump passe au spectroscope de Wdasm sans sourciller, avec toutes les options Strings Data
Glop ! Glop !
Prévenez la famille, le patient est sauvé !
Et maintenant, lève toi et marche...
Aie !
Y a 2000 ans, ça marchait mieux !
Le dump ne se lance pas, le programme plante ; Prévenez la famille, le patient est handicapé !
A moins que ?
Un instrument n'aurait il pas été oublié dans les codes du malade ?
Pt'et ben que ca s'rait du coté de l'Import Table ?
Vi, vi, scarabée,on va allez voir...
:bpx getprocaddress
Break due to BPX KERNEL32!GetProcAddress
Rapide analyse :
:d edi
:0047CBEE 52 65 67 43 6C 6F 73 65-4B 65 79 00 00 00 52 65 RegCloseKey...Re
:0047CBFE 67 43 72 65 61 74 65 4B-65 79 45 78 41 00 00 00 gCreateKeyExA...
:0047CC0E 52 65 67 44 65 6C 65 74-65 4B 65 79 41 00 00 00 RegDeleteKeyA...
:0047CC1E 52 65 67 44 65 6C 65 74-65 56 61 6C 75 65 41 00 RegDeleteValueA.
:0047CC2E 00 00 52 65 67 4F 70 65-6E 4B 65 79 45 78 41 00 ..RegOpenKeyExA.
:0047CC3E 00 00 52 65 67 51 75 65-72 79 56 61 6C 75 65 45 ..RegQueryValueE
:0047CC4E 78 41 00 05 00 00 52 65-67 53 65 74 56 61 6C 75 xA....RegSetValu
:0047CC5E 65 45 78 41 00 00 00 00-43 6C 6F 73 65 48 61 6E eExA....CloseHan:
Et ca, c'est quoi ca?
Une table d'import qui se fait modifier...
On relève l'adresse du début de celle ci: 0047C000
et on noppe les bidouille que ASPack fait à l'IAT:
:00BF0396 8908 MOV [EAX],ECX
:00BF0398 8B45D8 MOV EAX,[EBP-28]
:00BF039B 8B55E8 MOV EDX,[EBP-18]
:00BF039E 8910 MOV [EAX],EDX > ici
:00BF03A0 EB08 JMP 00BF03AA
:00BF03A2 8B45D8 MOV EAX,[EBP-28]
:00BF03A5 8B55F4 MOV EDX,[EBP-0C]
:00BF03A8 8910 MOV [EAX],EDX > et ici
:00BF03AA 83C604 ADD ESI,04
Il ne resteplus qu'à modifier l'adresse de l'import table (7C000)
Export Table
Import Table
Resource
Exception
Security
Relocations
Debug Datas
Description
GlobaI PTR
TLS table
Load Config
Bound lmport
IAT
|
0007F000 000002B4
0007C000 000001E4
00080000 00060200
00000000 00000000
00000000 00000000
000E5B74 00000008
00000000 00000000
00000000 00000000
00000000 00000000
000E5CB4 00000018
00000000 00000000
00000000 00000000
00000000 00000000
|
Allez, on recoud le tout, un p'tit effort…
Prévenez la famille, le patient est guéri !
Quels vont être ces premiers mots ?
UNREGISTERED
Bon, tant pis, on laisse tomber !
Interview de 3DExploration 1.2.54 sur son lit de mort
Par notre reporter spécial: Wdasm
Wdasm: Pourriez-vous vous
décrire?
3DExploration: Je suis une
Registered Version, c'est à dire que je dois recevoir un code pour continuer à exister.
Wdasm: Comment ca ?
3DExploration: Et bien j'ai
une petite boite d'enregistrement, où il faut entrer un code de 11 caractères , pour prolonger mon
existence, sinon je suis voué à être remplacé, changé, éradiqué....
Wdasm: Et il n'y a rien à
faire?
3DExploration: Si, mais c'est
une opération qui présente des risques, et qui est interdite par la loi.
Wdasm: Mais encore?
3DExploration: Voyez-vous,
il existe parfois des âmes charitables qui cherchent à nous donner la vie éternelle. C'est
totalement immoral.
Wdasm: Comment font-ils?
3DExploration: Voilà.
Pour commencer, ils font des examens poussés avec un désassembleur. Ils cherchent l'origine de tous
mes maux, comme par exemple le "UNREGISTERED", qui dans mon cas est très grave. Ils utilisent
des "String Data Références" pour découvrir à quel endroit exactement le
mal se développe. Pour moi tout commence en 0043E834…
Ensuite, ils recherchent comment la tumeur peut se développer. Ils ont rapidement trouvé un jne euthanasiaque
en 0043E83B.
:0043E834 E83D41FFFF call 00432976
:0043E839 85C0 test eax, eax
:0043E83B 7511 jne 0043E84E
* Possible StringData Ref from Data Obj ->" - UNREGISTERED"
|
:0043E83D 68EE214700 push 004721EE
:0043E842 8D8DFCFEFFFF lea ecx, dword ptr [ebp+FFFFFEFC]
:0043E848 51 push ecx
Wdasm: Vite, la suite!
3DExploration: Doucement,
c'est presque la fin! Donc ce saut aurait pu être évité par un test EAX,EAX favorable. Cette
opération m'aurait permis de durer éternellement puisque je n'aurais jamais su que je n'étais
pas ce que les gens appelle pudiquement "buggé", sans doute une histoire de subconscient...
Wdasm: Pourquoi ne pas l'avoir
fait?
3DExploration: Parce que ca
n'était pas satisfaisant. Dés le départ j'annonce ma fin à venir avec un rappel Shareware
de ma condition dans le bandeau d'écran, dans la boite About, dans le menu Help, et ces tristes rappels
auraient probablement fini par m'affliger au plus au point.
Wdasm: Qu'est qu'il aurait
fallu faire?
3DExploration: L'idéal
aurait été de me faire oublier tout ce qui pouvait faire référence à ma maladie,
et dans le call 00432976, il y avait des manipulations sur EAX qui me paraissaient bien prometteuses. Mais ils
n'ont rien voulu savoir!
:00432976 55 PUSH EBP
:00432977 8BEC MOV EBP,ESP
:00432979 E82BFFFFFF CALL 004328A9
:0043297E 85C0 TEST EAX,EAX
:00432980 0F94C0 SETZ AL
:00432983 83E001 AND EAX,01
:00432986 5D POP EBP
:00432987 C3 RET
Pourtant il aurait été facile de regarder d'un peu plus près
ce AND EAX,01, et de s'intéresser
aux conséquences d'une modification de son état en 00432983
Wdasm: Est ce que vous voulez
dire que de forcer le registre EAX à 01 vous aurez sauvé?
3DExploration: Peut-être
bien qu'un mov AL,01/ NOP...
Remplacer un tout petit 83E001 par un B00190...
Je ne le saurais jamais...
|