Reversing de faggoterie

Written by aaSSfxxx -

Ce matin, en naviguant sur HackerzVoice, j'ai l'agréable surprise de tomber sur ce magnifique post (qui a été supprimé depuis):

Bref, on se rend bien compte que ce genre de trucs seem legit, du coup let's reverse it ;).
Après un petit coup d'oeil avec IDA, on se rend compte que le machin a été écrit en AutoIT (lol), so on télécharge myAutToExe pour récupérer le code de l'exécutable, code qui possède une obfuscation assez lame (gros blocs de variables useless en plein milieu du code). On va donc nettoyer le code (la partie ennuyeuse du truc).

Bref pour les fainéants, je paste le code nettoyé, dispo ici, même si les vars au début (essentielles pour le fonctionnement du malware) sont fucked.
On remarque dans le code une fonction de cryptoshit, ainsi qu'une fonction pour faire du RunPE (smells "crypter"), ainsi qu'un auto-spread USB lame (recherche de clés branchées, et si c'est le cas, on se fout dessus + mise en place d'un autorun), ainsi qu'un downloader (mais ici, seul le RunPE a été activé).

On va donc reverse la fonction de crypto qui va balancer en mémoire un exécutable que va utiliser le RunPE (avec des trucs comme RunPE(@SCRIPTFULLPATH, BINARYTOSTRING(Cryptoshit($A6224827073, $F1367462515))) ). So, regardons la fonc renommée Cryptoshit (ici j'ai tronqué la variable $Z4515791355 pour pas tout défoncer).

FUNC Cryptoshit($G9095260435, $Key)
   LOCAL $Z4515791355= "0xC81001006A006A...C21000"
   LOCAL $Z3667942907= DLLSTRUCTCREATE("byte["& BINARYLEN($Z4515791355)& "]")
   DLLSTRUCTSETDATA($Z3667942907, 1, $Z4515791355)
   LOCAL $T2523372670= DLLSTRUCTCREATE("byte["& BINARYLEN($G9095260435)& "]")
   DLLSTRUCTSETDATA($T2523372670, 1, $G9095260435)
   DLLCALL(BINARYTOSTRING("0x7573657233322E646C6C"), "none", BINARYTOSTRING("0x43616C6C57696E646F7750726F63"), "ptr", DLLSTRUCTGETPTR($Z3667942907), "ptr", DLLSTRUCTGETPTR($T2523372670), "int", BINARYLEN($G9095260435), "str", $Key, "int", 0)
   LOCAL $R4297508756= DLLSTRUCTGETDATA($T2523372670, 1)
   $T2523372670= 0
   $Z3667942907= 0
   RETURN $R4297508756
ENDFUNC

On remarque ici que la fonction va appeler la fonction CallWindowProc avec pour fonction les grosses vars du début (celles qui ont été pétées par le disass). So, on va sortir OllyDBG, mettre un bp sur CallWindowProcA et CallWindowProcW pour retomber sur la fonction de déchiffrage ;)

Du coup on break sur la "WndProc", située en 020E2680, et après tout un tas de routines qui retrouvent les données chiffrées, on retrouve la fonction de chiffrage:

Ici, on voit un xor sur une donnée contenue dans ESI, chargé depuis [EBP+8] qui vaut 028B5FF0. En breakant sur "pop edi", on a bien l'exe déchiffré qui débute en 028B5FF0 et qui a une taille de 0x55000 octets. Il ne nous reste plus qu'à dump le tout et extraire le PE.

Le PE extrait est juste un sample de iStealer (lol again), et on récupère l'adresse du panel facilement avec mon extracteur de panel istealer (downloadeable ici)