NAWHACK

Blog d'informatique sécurité et réseaux.



XOR just for fun

Illustration de l'article

Soit un malware avec des serveurs C&C chiffrés, l'objectif est d'extraire des chaines de caractères chiffrées d'un malware. Ces chaines sont des noms de machine DNS de serveur C&C.

Le plus intéressant dans se genre de situation est d'automatiser l'extraction afin d'obtenir les informations simplement.

Extraction d'information du PE

Pour commencer, on va faire parler notre malware : objdump nous indique que le malware appel WS2_32.dll (avec tous ce qui va bien) pour parler avec les C&C.

$ objdump -x executable.2772.exe

...
	DLL Name: WS2_32.DLL
	vma: Hint/Ord Member-Name Bound-To
	5294 14 WSACleanup
	52a4 62 WSASocketA
	52b4 64 WSAStartup
	52c4 79 closesocket
	52d4 80 connect
	52e0 84 gethostbyname
	52f0 95 htons
...

Quelque informations sur les sections du programme :

$ objdump -h executable.2772.exe

	executable.2772.exe: file format pei-i386
	Sections:
	Idx Name Size VMA LMA File off Algn
	0 .text 000009e4 00401000 00401000 00000400 2**4
	CONTENTS, ALLOC, LOAD, READONLY, CODE, DATA
	1 .data 00000060 00402000 00402000 00000e00 2**2
	CONTENTS, ALLOC, LOAD, DATA
	2 .rdata 00000098 00403000 00403000 00001000 2**2
	CONTENTS, ALLOC, LOAD, READONLY, DATA
	3 .bss 000000e0 00404000 00404000 00000000 2**2
	ALLOC
	4 .idata 0000038c 00405000 00405000 00001200 2**2
	CONTENTS, ALLOC, LOAD, DATA

Petite extraction des chaines printables :

$ strings executable.2772.exe
...
	DEADBABE
	cmd.exe
	libgcj_s.dll
	_Jv_RegisterClasses
	vj(5ko
	jZGGURJ
	~lhrshm1DDTJHVJNNL
	a)o|2tjvSKWPPISDC
	iy|lz
	RG[]
	UBZKCJB
	IFB]A
	lq+hun0s
	_ G[M
	Mwb Hw
	(Mw7
	MwB1Mwf
	a6zw
	Hzw3q{w
...

On a des strings dans les segments .data et .rdata.

Mettons les mains dans le cambouis avec OllyDBG :)

Nous avons une fonction intéressante à l'offset 0x004012F0. Celle-ci déchiffre des données grâce à la clé DEADBABE.
Chaque caractère de la chaine DEADBABE est extrait puis aditionné par leur code hexadécimal.

Reverse engineering OllyDBG

Reverse engineering OllyDBG

0x44 + 0x45 + 0x41 etc. La clé de base est donc initialisée à 0x18.

On retrouve les offsets des strings à décoder dans le segment data. Ce qui nous interesse est donc dans le segment rdata à partir l'offset 0x00403024.

Reverse engineering OllyDBG

Chaque caractère est xoré avec la clé. C = DATA⊕KEY

La clé est ensuite incrémenté de 1 à chaque passage dans la boucle. KEY+1

La clé n'est donc pas constante.

Reverse engineering OllyDBG

Voici un exemple de code python qui va déchiffrer les données du segment data.


import sys
filename='executable.2772.exe'
offset = 0x1000
size = 0x98
sum = 0x00
key = 0x00
string_key = b'DEADBABE'
result = ''
file = open(filename, 'rb')
byteArray = bytearray(file.read())
file.close()
for x in string_key:
        sum = ((sum + x) % 512)
key = sum
for i in range (0, size):
        if (byteArray[offset + i] != 0):
                result = result + chr(byteArray[offset + i] ^ sum)
                sum = sum +1
        else:
                print (result)
                result = ''
                sum = key

Le programme décode le serveur C&C, fait une résolution de nom puis ouvre un socket vers le port 80 du serveur.

Ci-dessous le corps du programme :

Reverse engineering OllyDBG


  • le 24/11/2014
  • par Nawhack