Problema con SetUnhandledExceptionFilter y Curso

Iniciado por x64core, 8 Octubre 2012, 21:29 PM

0 Miembros y 1 Visitante están viendo este tema.

x64core

saludos a todos tengo ya algunos dias de seguir el curso de ricardo narvaja, así no me sido dificil ni un poco seguirlo por la experiencia que ya tenia pero tengo algunos problemas con la leccion 22, con el crackme "Sphynx", donde enseña a saltarse el
truco de las exceptiones, bueno estaba en windows 7 y estaba siguiendo los pasos y como que el olly no hace o se va hacia otra direccion y/o termina. luego pense que quiza era porque tendria que ser en XP, ok lo probe en windows XP pero tampoco funciono.
pongo un bp en SetUnhandledExceptionFilter y UnhandledExceptionFilter

run, captura la direccion de la excepcion, pongo el bp:
00401108                              . 8B75 08        MOV ESI,DWORD PTR SS:[EBP+8]
0040110B                              . 8B46 04        MOV EAX,DWORD PTR DS:[ESI+4]
0040110E                              . 05 B8000000    ADD EAX,0B8
00401113                              . 8BF0           MOV ESI,EAX
00401115                              . 8B00           MOV EAX,DWORD PTR DS:[EAX]
00401117                              . 83C0 0E        ADD EAX,0E

(misma direccion) todo bien.
luego run, carga el programa, escribo algo, check, y para en

7C8645AA UnhandledExceptionFilter     68 48020000      PUSH 248
7C8645AF                              68 8850867C      PUSH kernel32.7C865088


luego run, y se detiene en
004010CC                              . 8915 04114000  MOV DWORD PTR DS:[401104],EDX
004010D2                              . 81FA 72930100  CMP EDX,19372
004010D8                              . 74 09          JE SHORT Sphynx.004010E3
004010DA                              . EB 22          JMP SHORT Sphynx.004010FE
004010DC                              > E8 BB000000    CALL <JMP.&kernel32.DebugBreak>          ; [DebugBreak
004010E1                              . EB 13          JMP SHORT Sphynx.004010F6
004010E3                              > 6A 00          PUSH 0                                   ; /Style = MB_OK|MB_APPLMODAL
004010E5                              . 68 63314000    PUSH Sphynx.00403163                     ; |Title = ""
004010EA                              . 68 76314000    PUSH Sphynx.00403176                     ; |Text = ""
004010EF                              . 6A 00          PUSH 0                                   ; |hOwner = NULL
004010F1                              . E8 A0000000    CALL <JMP.&user32.MessageBoxA>           ; \MessageBoxA

con:
debbugged program was unable to process exception

en seven es peor porque para en DebugBreak y luego termina con TerminateProcess osea no captura nada.
alguien puede hecharle un ojo por favor?

aqui
esta el programa del curso:
http://www.mediafire.com/?3cmxaa81bxs8ec8

.:UND3R:.

#1
No recuerdo muy bien este tutorial pero intentaré hacer un análisis rápido de lo que puedo ver, al iniciar el crackme se logra visualizar a simple vista que no posee ningún tipo de protección de packer, además:

OEP:
Código (asm) [Seleccionar]
00401000 >/$  68 08114000   PUSH Sphynx.00401108                     ; /pTopLevelFilter = Sphynx.00401108

además de eso vemos que lo primero que intenta hacer el programa es instalar un manejador de excepciones (destacamos dos tipos de manejadores de excepciones, uno utilizado comúnmente llamando a SetUnhandledExceptionFilter (esta API recibe un puntero a la función o dirección encargada de manejar las excepciones) o instalando un manejador por hilos (thread) alterando la estructura ERR (exception registration record) ubicada en dentro del TIB (thread information block)

Si nos dirigimos a dirección encargada de manejar las excepciones veremos lo siguiente:

Código (asm) [Seleccionar]
00401108   .  8B75 08       MOV ESI,DWORD PTR SS:[EBP+8]
0040110B   .  8B46 04       MOV EAX,DWORD PTR DS:[ESI+4]
0040110E   .  05 B8000000   ADD EAX,0B8
00401113   .  8BF0          MOV ESI,EAX
00401115   .  8B00          MOV EAX,DWORD PTR DS:[EAX]
00401117   .  83C0 0E       ADD EAX,0E
0040111A   .  8906          MOV DWORD PTR DS:[ESI],EAX
0040111C   .  A1 53314000   MOV EAX,DWORD PTR DS:[403153]
00401121   .  33C9          XOR ECX,ECX
00401123   .  33D2          XOR EDX,EDX
00401125   .  33FF          XOR EDI,EDI
00401127   >  0FBEB9 543040>MOVSX EDI,BYTE PTR DS:[ECX+403054]
0040112E   .  81C2 78563412 ADD EDX,12345678
00401134   .  D1D2          RCL EDX,1
00401136   .  13D7          ADC EDX,EDI
00401138   .  81C2 21436587 ADD EDX,87654321
0040113E   .  41            INC ECX
0040113F   .  3BC8          CMP ECX,EAX
00401141   .^ 75 E4         JNZ SHORT Sphynx.00401127
00401143   .  81FA 382AB4C3 CMP EDX,C3B42A38
00401149   .  75 32         JNZ SHORT Sphynx.0040117D
0040114B   .  33C9          XOR ECX,ECX
0040114D   .  33D2          XOR EDX,EDX
0040114F   .  BE 07304000   MOV ESI,Sphynx.00403007
00401154   .  BF 63314000   MOV EDI,Sphynx.00403163
00401159   .  8A56 12       MOV DL,BYTE PTR DS:[ESI+12]
0040115C   >  8A0431        MOV AL,BYTE PTR DS:[ECX+ESI]
0040115F   .  32C2          XOR AL,DL
00401161   .  880439        MOV BYTE PTR DS:[ECX+EDI],AL
00401164   .  41            INC ECX
00401165   .  83F9 31       CMP ECX,31
00401168   .^ 75 F2         JNZ SHORT Sphynx.0040115C
0040116A   .  6A 00         PUSH 0                                   ; /Style = MB_OK|MB_APPLMODAL
0040116C   .  68 63314000   PUSH Sphynx.00403163                     ; |Title = ""
00401171   .  68 76314000   PUSH Sphynx.00403176                     ; |Text = ""
00401176   .  6A 00         PUSH 0                                   ; |hOwner = NULL
00401178   .  E8 19000000   CALL <JMP.&user32.MessageBoxA>           ; \MessageBoxA
0040117D   >  33C0          XOR EAX,EAX
0040117F   .  48            DEC EAX
00401180   .  C9            LEAVE
00401181   .  C2 0400       RETN 4


*Colocamos un BP al inicio

Sin indagar supongo que el ejecutable tiende a generar una excepción intencionalmente con la finalidad de pasar por algún tipo de validación.

Ahora tu posible falencia: si ponemos un BP en 00401108 y damos run(F9) OllyDbg se detiene y nos avisa lo siguiente:
DebugBreak Called from 004010DC

si nos dirigimos ahí veremos lo siguiente:

Código (asm) [Seleccionar]
00401084   > \68 FF000000   PUSH 0FF                                 ; /Count = FF (255.)
00401089   .  68 54304000   PUSH Sphynx.00403054                     ; |Buffer = Sphynx.00403054
0040108E   .  68 E9030000   PUSH 3E9                                 ; |ControlID = 3E9 (1001.)
00401093   .  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |hWnd
00401096   .  E8 F5000000   CALL <JMP.&user32.GetDlgItemTextA>       ; \GetDlgItemTextA
0040109B   .  83F8 01       CMP EAX,1
0040109E   .  A3 53314000   MOV DWORD PTR DS:[403153],EAX
004010A3   .  7D 02         JGE SHORT Sphynx.004010A7
004010A5   .  EB 57         JMP SHORT Sphynx.004010FE
004010A7   >  E8 02010000   CALL <JMP.&kernel32.IsDebuggerPresent>   ; [IsDebuggerPresent
004010AC   .  83F8 00       CMP EAX,0
004010AF   .  75 2B         JNZ SHORT Sphynx.004010DC
004010B1   .  A1 53314000   MOV EAX,DWORD PTR DS:[403153]
004010B6   .  33C9          XOR ECX,ECX
004010B8   .  33D2          XOR EDX,EDX
004010BA   .  33FF          XOR EDI,EDI
004010BC   >  0FBEB9 543040>MOVSX EDI,BYTE PTR DS:[ECX+403054]
004010C3   .  13D7          ADC EDX,EDI
004010C5   .  D1D2          RCL EDX,1
004010C7   .  41            INC ECX
004010C8   .  3BC8          CMP ECX,EAX
004010CA   .^ 75 F0         JNZ SHORT Sphynx.004010BC
004010CC   .  8915 04114000 MOV DWORD PTR DS:[401104],EDX
004010D2   .  81FA 72930100 CMP EDX,19372
004010D8   .  74 09         JE SHORT Sphynx.004010E3
004010DA   .  EB 22         JMP SHORT Sphynx.004010FE
004010DC   >  E8 BB000000   CALL <JMP.&kernel32.DebugBreak>          ; [DebugBreak


Como puedes ver la API IsDebugPresent detectó que el proceso estaba siendo debugeado (FS:[30] + 2 bytes) ya detectado llamó a la API DebugBreak, por lo que deberíamos nopear el salto:
Código (asm) [Seleccionar]
004010AF   . /75 2B         JNZ SHORT Sphynx.004010DC

Luego si sigues traceando podrás ver el punto en donde se genera la excepción, si la saltas con Shift + F8, verás que OllyDbg se detiene justo al inicio del manejador de excepciones, en donde mostrará un mensaje si es que hemos acertado.

Saludos


Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)

PeterPunk77

Buenas RHL,
a ver, yo no he hecho nunca el curso de Ricardo Narvaja  :silbar: pero acabo de ver el crackme por encima y parece resoluble en W7 64 bits sin ningún plugin.

Arranco el programa con el Olly y veo:
00401000 >/$ 68 08114000    PUSH Sphynx.00401108                     ; /pTopLevelFilter = Sphynx.00401108
00401005  |. E8 AA010000    CALL <JMP.&kernel32.SetUnhandledExceptio>; \SetUnhandledExceptionFilter

por lo que veo que intuyo que el programa va a generar una excepción para ejecutar el código que se encuentra a partir de 0x401108. Así que:
BPX 401108
Y como me suena que el UnhandledExceptionFilter no funciona igual mientras estás debuggeando al programa debido al uso de ZwQueryInformationProcess, le pongo un punto de ruptura:
BP UnhandledExceptionFilter
También aprovecho para "nopear":
004010AF     75 2B          JNZ SHORT Sphynx.004010DC
porque como he dicho no tengo ningún plugin y debo que evitar el IsDebuggerPresent.
Corro el programa, introduzco algo en el serial, y al probar el Olly me para con "Breakpoint at kernel32.UnhandledExceptionFilter :
769976F7 > 6A 5C            PUSH 5C
769976F9   68 18789976      PUSH kernel32.76997818
769976FE   E8 ED9EFDFF      CALL kernel32.769715F0
76997703   C745 E0 06000000 MOV DWORD PTR SS:[EBP-20],6
7699770A   33F6             XOR ESI,ESI
7699770C   8975 E4          MOV DWORD PTR SS:[EBP-1C],ESI
7699770F   8975 DC          MOV DWORD PTR SS:[EBP-24],ESI
76997712   8975 D8          MOV DWORD PTR SS:[EBP-28],ESI
76997715   8B5D 08          MOV EBX,DWORD PTR SS:[EBP+8]
76997718   8B03             MOV EAX,DWORD PTR DS:[EBX]
7699771A   F640 04 10       TEST BYTE PTR DS:[EAX+4],10
7699771E   0F85 40020000    JNZ kernel32.76997964
76997724   C745 D4 01000000 MOV DWORD PTR SS:[EBP-2C],1
7699772B   8138 090400C0    CMP DWORD PTR DS:[EAX],C0000409
76997731   0F84 3F0A0000    JE kernel32.76998176
76997737   53               PUSH EBX
76997738   E8 AC010000      CALL kernel32.769978E9
7699773D   83F8 FF          CMP EAX,-1
76997740   0F84 25020000    JE kernel32.7699796B
76997746   E8 16010000      CALL kernel32.76997861
7699774B   85C0             TEST EAX,EAX
7699774D   0F85 11020000    JNZ kernel32.76997964

He copiado hasta ahí, porque en este último salto ya me iría por mal camino (vamos, que EAX tendría que estar a 0 y yo lo tengo a 1). Así que cambio el Z Flag para que no salte y le doy a F9, con lo que ya consigo que el Olly se me pare con "Breakpoint at Sphynx.00401108".

Saludos.