Quizás os interese, yo he intentado algo pero nada...tiene protecciones que no entiendo como funcionan :S
[Enlace externo eliminado para invitados]

Si conseguís algo avisad ;)
Saludos
Vaya que es interesante ese ejecutable nunca había visto algo parecido.
No tiene ninguna tabla de directorios, ni importaciones ni exportaciones, no tiene tabla de recursos.
Solo dos secciones? eso es muy extraño
Le dare un vistazo en ejecución en un rato.
We do what we must, because, we can-> [www.youtube.com/watch?v=Y6ljFaKRTrI]
Pasa a saludar: NeoDark-Labs.BlogSpot.mx
<<<<Proyectos en curso>>>>
[+]Restauración de SSDT
[+]Driver v3 - Ocultar drivers
[+]Anti-rootkit
Podéis confirmarme si el ejecutable corre bajo Windows 7? O es parte del reto hacer además que el ejecutable funcione?

Muchas gracias,
Iván Portilla.
En tu ventana
Y en tu ventana, gritas al cielo pero lo dices callada..
Pues tienes razón. Sólo lo había probado en una máquina virtual con XP.
De todas formas lo he parcheado para que funcione en W7:
[Enlace externo eliminado para invitados]

Suerte.
Imagen
@PeterPunk ¿que has cambiado?

Estuve intentando poner un breakpoint en la funcion MEssageBoxA que es llamada cuando introduces un serial incorrecto. El exe detecta de todos, software breakpoint, hardware breakpoint, lo intente incluso con un debugger remoto con windbg y nada.

El exe original crea un ejecutable tmp.tmp que es el que se ejecuta realmente, pero este exe es muyyy raro, y no funciona el solo, necesita ser lanzado por el exe del reto.

Si sacais algo mas en claro decidlo jeje.
Saludos
Buenas Thor,
simplemente he parcheado algo que hacía que no funcionase en W7. Por lo menos a mi, al igual que a The Swash, no me corría en W7 y con este pequeño cambio sí que me va.
Con respecto a la resolución del crackme, es muy sencillo.
Como bien aprecias, el crackme realmente es el archivo tmp.tmp que es un ejecutable renombrado y si lo estudias sólo verás que se para en un INT3 con código raro y luego se cierra. Sin embargo al arrancar el otro ejecutable va bien, y además mientras está así no puedes adjuntarte a él (attach). Si alguna vez te has peleado con un Armadillo ya deduces lo que es. El programa "cargador" arranca al tmp.tmp como si fuese un debugger (por eso no puedes usar el "Attach" del Olly) y lo que hace es pararse en los INT3 (realmente la instrucción INT3, 0xCC es la que usan los debuggers como puntos de ruptura) que están desperdigados por el código y actúa en consecuencia. A estos INT3 en el código y actuación en consecuencia se la llaman Nanomites.
Y lo importante, y pasando de toda la teoría anterior. Sabemos que el ejecutable tmp.tmp no funciona bien sólo, pero sí que lo hace con el lanzador porque hay código que no parece correcto. ¿Qué API puede usar el lanzador para cambiar el código del "crackme real" mientras se está ejecutando? Y la respuesta es "WriteProcessMemory". Así que si pones un BP en esa API e introduces un nombre y un serial, el Olly se para y te muestra:

Código: Seleccionar todo

0012FF88   003013B4  /CALL to WriteProcessMemory from unpackme.003013AE
0012FF8C   0000003C  |hProcess = 0000003C (window)
0012FF90   0040137E  |Address = 40137E
0012FF94   00301651  |Buffer = unpackme.00301651
0012FF98   00000004  |BytesToWrite = 4
0012FF9C   00000000  \pBytesWritten = NULL
que quiere decir que en el Virtual Address 0x401373 del tmp.tmp va a escribir los 4 bytes que se encuentran en el buffer (botón derecho en esa línea y "Follow in dump". En este caso van a ser "8B742404" (que por cierto es "mov esi, [esp+4]"). Así que si abres en un otro Olly una copia del tmp.tmp podrás realizar este cambio.
Sigues ejecutando el código y verás como el lanzador escribe algo válido en todas las paradas INT3 y también las borra. Pero tú vas copiando los bytes en el otro Olly y al final tendrás el ejecutable completo y lo puedes estudiar.
Como sé que no me he explicado muy bien, puedes consultarme cualquier duda.
Saludos.
Imagen
PeterPunk, muchas gracias.

Puedo saber a que corresponden esos 12 bytes que has modificado para que funcione en 7? Tal parece tienen que ver mucho con el resultado de una rutina de descifrado.

Y si puedes comentarnos con detalle lo agradecería.

Muchas gracias,
Iván Portilla.
En tu ventana
Y en tu ventana, gritas al cielo pero lo dices callada..
Buenas The Swash,

pues simplemente he buscado qué línea producía el error que impedía al crackme ejecutarse en W7.
Era la línea 0x301848 que pertenece a la función:

Código: Seleccionar todo

0030182F     60                  PUSHAD
00301830     33D2                XOR EDX,EDX
00301832     64:8B32             MOV ESI,FS:[EDX]
00301835     AD                  LODS DWORD PTR [ESI]
00301836     83F8 FF             CMP EAX,-1
00301839     74 04               JE SHORT 0030183F
0030183B     8BF0                MOV ESI,EAX
0030183D   ^ EB F6               JMP SHORT 00301835
0030183F     8B7E 04             MOV EDI,[ESI+4]
00301842     81E7 0000FFFF       AND EDI,FFFF0000
00301848     66:813F 4D5A        CMP WORD PTR [EDI],5A4D
0030184D     74 08               JE SHORT 00301857
0030184F     81EF 00000100       SUB EDI,10000              ; UNICODE "=::=::\"
00301855   ^ EB F1               JMP SHORT 00301848
00301857     8BDF                MOV EBX,EDI
00301859     035B 3C             ADD EBX,[EBX+3C]
0030185C     66:813B 5045        CMP WORD PTR [EBX],4550
00301861     74 02               JE SHORT 00301865
00301863   ^ EB E3               JMP SHORT 00301848
00301865     897C24 1C           MOV [ESP+1C],EDI
00301869     61                  POPAD
0030186A     C3                  RET
y generaba el error "Access violation when reading [...]".

Como bien sabes en FS:[0] Windows carga su manejador de excepciones, para que en caso de error en la ejecución del programa el S.O. actúe en consecuencia. El problema viene porque parece que ese manejador difiere entre el WXP y el W7. O sea que si arrancas un programa con el OllyDbg en el XP y vas a "View -> SEH chain", y luego lo sigues en la pila verás algo así:

Código: Seleccionar todo

0012FFE0   FFFFFFFF  End of SEH chain
0012FFE4   7C839AC0  SE handler
0012FFE8   7C817070  kernel32.7C817070
mientras que haciendo lo mismo en el 7 verás esto en la pila:

Código: Seleccionar todo

0018FFC4  |FFFFFFFF  End of SEH chain
0018FFC8  |772F71D5  SE handler
0018FFCC  |0198B283
Vamos, en XP hay dos direcciones del kernel32 y en el 7 una única del ntdll. Y como lo que pretende el código es sacar la dirección dónde está cargado el kernel32 a partir de esa segunda dirección que falta en el Windows 7 ya tenemos el error.

Así que lo único que he hecho es cambiar el código por:

Código: Seleccionar todo

0030182F     60                  PUSHAD
00301830     33D2                XOR EDX,EDX
00301832     64:8B32             MOV ESI,FS:[EDX]
00301835     AD                  LODS DWORD PTR [ESI]
00301836     83F8 FF             CMP EAX,-1
00301839     3E:8B7C24 28        MOV EDI,DS:[ESP+28]
0030183E     90                  NOP
0030183F     90                  NOP
00301840     90                  NOP
00301841     90                  NOP
00301842     81E7 0000FFFF       AND EDI,FFFF0000
00301848     66:813F 4D5A        CMP WORD PTR [EDI],5A4D
0030184D     74 08               JE SHORT 00301857
0030184F     81EF 00000100       SUB EDI,10000              ; UNICODE "=::=::\"
00301855   ^ EB F1               JMP SHORT 00301848
00301857     8BDF                MOV EBX,EDI
00301859     035B 3C             ADD EBX,[EBX+3C]
0030185C     66:813B 5045        CMP WORD PTR [EBX],4550
00301861     74 02               JE SHORT 00301865
00301863   ^ EB E3               JMP SHORT 00301848
00301865     897C24 1C           MOV [ESP+1C],EDI
00301869     61                  POPAD
0030186A     C3                  RET
para que EDI en la línea 0x301848 esté apuntando a una zona del kernel32.

Y ese es el único cambio a realizar en el código, pero como todo el mundo ha observado el programa está ofuscado y encriptado. Así que tocó ver cómo se desencriptaba. También muy sencillo: he puesto un HWBP de escritura en 0x301839 y he visto lo que hace para luego invertirlo ya que simplemente para cada dword hace un ADD, un ROL y un XOR con un valor que se incrementa 0x25D4140 cada vez que cambia al siguiente dword. No creo que tengas ningún problema en encontrar esta parte del descifrado en el código y su funcionamiento por si también quiereso necesitas parchear algo más.

De todas formas si tienes cualquier duda no dudes en preguntar que intentaré ayudarte en lo que pueda.

Saludos.

PD: He escrito todo este post como dando por hecho que la diferencia es entre el Windows XP y el Windows 7, pero no estoy para nada seguro. También podría ser una diferencia entre windows de 32 y 64 bits. Así que si alguien lo puede probar en un Windows XP de 64 bits y/o en un Windows 7 de 32 bits le estaría muy agradecido.
Imagen
Hola PeterPunk,

Primero que todo gracias por tomarte el tiempo de explicarlo de forma tan detallada. Segundo ofrezco una disculpa por no haber visto un error que estaba DE FRENTE (Estaba con una versión de OllyDGB modificada y ya sabes como traen el manejo de excepciones, y por ende jamás me paraba donde necesitaba para ver el error.) Si la rutina tuve oportunidad de verla para poder poner un breakpoint en PUSHAD.

Estás en lo cierto, la SEH se comporta de manera distinta (por defecto) en Windows XP que en Windows 7. Resalto que mi Windows 7 es de 32-bit. Y si que la SEH es una dirección en NTDLL.

También entendí lo que hiciste de [ESP+28] ya que es la parte de la dirección de kernel32.BaseThreadInitThunk que llama a RtlExitUserThread en Windows 7 y en XP a ExitThread, con eso tiene una dirección en el rango de kernel32 y al hacerle el AND 0xFFFF0000, obtiene el ImageBase.

Nota del día: "Recuerda ver las configuraciones de tu depurador antes de utilizarlo."

Muchas gracias,
Iván Portilla.
En tu ventana
Y en tu ventana, gritas al cielo pero lo dices callada..
Gracias a ti The Swash por aclarar que la diferencia de comportamiento del SEH era debido al Windows 7 y no específico de una edición de 64 bits.

Por otro lado, ahora veo que tenía que haber profundizado en el motivo por el cual parcheé con "MOV EDI,DS:[ESP+28]", ya que tú lo has entendido perfectamten pero un neófito quedaría con la duda.

Y ya por último quería destacar que éste podría ser un buen ejemplo de ingeniería inversa "legal" (al menos no ilegal aunque dependería de la legislación de cada estado). Imaginemos que tienes un programa licenciado o freeware y que ya no se actualiza por cualquier motivo. Unos años después te ves obligado a cambiar de sistema operativo y ese programa que tienes legalmente ya no se ejecuta. Parchearlo para que corra en ese nuevo S.O. "en principio" no es ilegal ya que no estás intentando evitar una protección para emplearlo sin haberlo adquirido legalmente sino que estás estás intentando solucionar un problema con el que no contaba el autor en un programa licenciado y desactualizado.

Saludos.
Imagen
Hombre, los agradecimientos son para ti.

Entonces "parchar" el servidor del Poison IVY para que corra en Windows 7 no es ilegal. (?)
Volviendo al Unpackme, quería mirar de alguna forma su rutina en IDA, pero irónicamente en una parte el análisis falla. Llego a suponer que no es capaz de analizar por los datos cifrados y el desensamblador falla, creo que será mejor poner breakpoints en escritura sobre la sección de código para que descifre y luego poner un breakpoint en dichas rutinas para seguirlo.

Gracias por tu amabilidad y la lección de "leyes" y legislaciones :P

Un saludo,
Iván Portilla.
En tu ventana
Y en tu ventana, gritas al cielo pero lo dices callada..
PeterPunk me quito el sombrero pero q explicacion la verda exelente
se le entiende a la primera
Mi blog

www.MasaSoftware.blogspot.com

Encontraras herramientas como el Masacrypter mods Indetectables joiner

___________
Responder

Volver a “Cracking/Reversing”