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
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:
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:
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:
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:
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
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.