Extraction de String / Episode A

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+

This entry was posted in Asm, Reverse and tagged , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

AlphaOmega Captcha Classica  –  Enter Security Code