Bon… des fois, la fonction d’obfuscation de string d’un malware est chiante et illisible (bref comme il faudrait que ce soit) Et en plus décousue, je veux dire par là que le malware va la picorer et ne deobfusque pas toutes les strings d’un coup. Bref dans ce cas la… on va lancer cette petite fonction avec toutes les strings offusquée pour tout clarifier.
Donc j’ai pondu un dégeulasse petit prog qui remappe l’exe en mémoire et appelle la dite fonction pour arracher les strings. Il prend ses commandes depuis un fichier texte.
Petit exemple, On ferme les yeux, devant vous un superbe malware qui obfusque ses strings, (voir https://github.com/Th4nat0s/Chall_Tools/blob/master/C/usefonc/hello.cpp)
#include <windows.h> #include <stdio.h> char obf[] = "HAL"; int key = 1; int unobf(int incr, char mystring[]) { char i=0; do { mystring[i] = mystring[i] + incr; i++; } while (mystring[i] != 0); } int main(){ printf( "Obfuscation Function at %p\n", int(unobf)); printf( "Obfuscated string at %p\n", int(&obf)); printf( "Obfuscated Key at %p\n", int(&key)); unobf( key, obf); printf( "The computer brand is %s\n", obf); return(0); }
Bref un petit prog typique d’obfuscation de string a deux balles. Normalement il faut prendre IDA pour savoir ce qu’il appelle et comment, là il est sympas il file les offsets :) . Ensuite on remplis le fichier texte.
; offset , obfstr, key 0402008,0040200C,004013A0 0402008,0040200C,004013A0 ; nop
Le premier paramètre c’est l’offset de la fonction de décryptage, le second c’est la string obfusquée et le 3eme c’est la clef d’encryption (Si il y a besoin).
A coté de cela, parce que défois, les appel de fonctions ne sont pas standard C (merci Delphi), pour remapper le call comme on veut rapidement, j’ai fait un petit bout en asm intermédiaire. C’est plus simple. (voir https://github.com/Th4nat0s/Chall_Tools/blob/master/C/usefonc/usefonc.asm)
push ebp mov ebp,esp pusha mov [myesp],esp mov ebx,[ebp+0x08] ; Second Parameter = Obf String mov ecx,[ebp+0x0c] ; Third Parameter = Key add esp,256 ; keep space on stack ;--------------------------- ; Remap function call as expected.. push ebx ; Push Ascii String offset ( type pointer) mov ecx,[ecx] push ecx ; push value of Key (type integer) call [ebp+0x10] ; Call the fuction to decode ; on the hello example the result in in EBX ; considerer ici que tous les registres sont détruit.. mov [sauvegarde],EBX ;------------------------- mov esp,[myesp] ; Get back the stack on the good place popa pop ebp mov eax, [sauvegarde] ; Get back the string offset• ret
Et pof on lance…
C:\Users\Administrator\Documents\code>usefonc.exe hello.exe query.txt Loading hello.exe in memory load file ok PE32 Detected IMAGEBASE: 0x00400000 SIZEOFIMG: 0x0000f000 - 61440 Bytes Memory allocatedCurrent Process: 0x00400000 Loading command query.txt file Read 6 command lines line 2 - 0402008,0040200C,004013A0 line 3 - 0402008,0040200C,004013A0 0x00402008:IBM 0x00402008:JCN
Bingo…
Et si c’était a refaire, je ferais plus comme cela, je partirais sur un start suspended et je loaderai une DLL qui hookerai le process et qui ferait tout le taf, et en plus les lib seraient tous loadées.
Là j’ai des soucis, défois le Malloc de l’espace 0x40000 est pas forcément possible et il faut relancer deux trois fois le bignou.
Next step, le python qui pond automatiquement le fichier de commande sous IDA. En attendant, si cela sert a quelqu’un, le source est là :
https://github.com/Th4nat0s/Chall_Tools/tree/master/C/usefonc
a+