Bonjour,
J'ai codé en ASM un petit shellcode qui :
1/ patch l'adresse du SEH handler dans la stack
2/ créé une exception div par 0
3/ gère l'exeption et modifie le registre EIP pour sauter après le div
4/ recharge le context pour que l'execution du prog continue après le div tranquillement
Quand je compile le shellocode sous MASM32, il marche très bien (vérifié sous olly).
Parcontre quand je le compile avec VisualStudio 2008 dans une dll en cpp, il bloque sur l'exception. Pourtant le SEH handler est bien patché dans la stack.
/!\ Je ne veux pas utiliser try et catch en cpp !
Je veux juste comprendre pourquoi je n'arrive pas à gérer mon exception quand c'est compilé avec VisualStudio.
Quelqu'un peut m'éclairer s.v.p ? C'est important. Merci d'avance
Voici mon shellcode en hexa :
Shellcode en ASM :
Code : Sélectionner tout - Visualiser dans une fenêtre à part EB195E64A10000000083C00489306633C066F7F0E80D000000EB15E8E2FFFFFF8B4C240CEBEE5E89B1B800000033C0C3
Mes options de compilation dans VisualStudio :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 jmp short _seh_handler _code: pop esi mov eax ,dword ptr fs:[0] add eax, 4 mov [eax], esi ; patch le SEH handler xor ax, ax ; créé une exeption div par 0 div ax _new_eip: call _eip jmp _end _seh_handler: call _code mov ecx, [esp+0Ch] ; ecx = adresse de la structure CONTEXT jmp short _new_eip _eip: pop esi mov dword ptr [ecx+0B8h], esi ; on va donc modifier eip pour sauter par dessus l'exception xor eax, eax ; recharge le context retn _end:
Et du Linker:/O2 /Os /GL /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_USRDLL" /D "MaLib_EXPORTS" /D "_WINDLL" /D "_MBCS" /FD /EHa /MT /GS- /Zc:wchar_t- /Zc:forScope- /GR- /Fo"Release\\" /Fd"Release\vc90.pdb" /W3 /nologo /c /Gd /TP /errorReport:prompt
/OUT:"C:\MaLib.dll" /INCREMENTAL:NO /NOLOGO /DLL /MANIFEST:NO /DEF:"exports.def" /SUBSYSTEM:WINDOWS /OPT:REF /OPT:ICF /ENTRY:"DllMain" /DYNAMICBASE:NO /MACHINE:X86 /ERRORREPORTROMPT ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
Partager