Foro de elhacker.net

Programación => Ingeniería Inversa => Mensaje iniciado por: arfgh en 7 Julio 2016, 15:48 pm



Título: Ayuda con una modificación que no funciona
Publicado por: arfgh en 7 Julio 2016, 15:48 pm
Hola amigos.

Estoy intentando hacer una modificación en un programa, que hace una llamada a la api 'Stretchblt', entonces antes de producirse la llamada he introducido un salto incondicional a una parte vacía al final del código para insertar allí mi asm :P
Evidentemente algo estoy haciendo mal ya que cuando ejecuto el programa, este revienta, también ejecutando paso a paso con el ollydbg no me pasa de una linea.

Mirad el código:

Código:

0048D773   .  52            PUSH EDX
0048D774   .  50            PUSH EAX
0048D775   .  E9 CD220200   JMP 004AFA47
0048D77A   .  FF15 90038700 CALL NEAR DWORD PTR DS:[<&GDI32.StretchBlt>]   \GDI32.StretchBlt

ahí podéis ver el salto incondicional, en su lugar estaba el comando Push EAX.


004AFA46   .  00            DB 00
004AFA47   >  50            PUSH EAX
004AFA48   .  A0 46FA4A00   MOV AL,BYTE PTR DS:[4AFA46]
004AFA4D   .  FEC0          INC AL
004AFA4F   .  3C 03         CMP AL,3
004AFA51   .  74 1C         JE SHORT 004AFA6F
004AFA53   .  3C 04         CMP AL,4
004AFA55   .  74 18         JE SHORT 004AFA6F
004AFA57   .  3C 05         CMP AL,5
004AFA59   .  74 14         JE SHORT 004AFA6F
004AFA5B   .  3C 06         CMP AL,6
004AFA5D   .  74 10         JE SHORT 004AFA6F
004AFA5F   .  A2 46FA4A00   MOV BYTE PTR DS:[4AFA46],AL
004AFA64   .  58            POP EAX
004AFA65   .  6A 00         PUSH 0
004AFA67   .  6A 00         PUSH 0
004AFA69   >  51            PUSH ECX
004AFA6A   .^ E9 F6DCFDFF   JMP 0048D765
004AFA6F   >  A2 46FA4A00   MOV BYTE PTR DS:[4AFA46],AL
004AFA74   .  58            POP EAX
004AFA75   .  68 80000000   PUSH 80
004AFA7A   .  68 80000000   PUSH 80
004AFA7F   .^ EB E8         JMP SHORT 004AFA69


Pues bien, cuando intento guardar mi contador con MOV BYTE PTR DS:[4AFA46],AL
pues el ollydbg no pasa de esa linea. Evidentemente entiendo muy poco de asm, y no sé que es lo que me está faltando.

ayuda y gracias.


Título: Re: Ayuda con una modificación que no funciona
Publicado por: MCKSys Argentina en 7 Julio 2016, 16:17 pm
Hola!

Por lo que veo, 4AFA46 es el primer byte (DB 00) de tu código.
Ahora, normalmente la sección de código no es escribible y tu estás en ella.
Tienes 2 opciones: o haces la sección de código escribible (con CFFExplorer o la tool de tu preferencia) o bien usas una dirección que esté en la sección data (recomendable cerca del final para evitar que el programa machaque el byte), la cual, normalmente, sí es escribible pero no ejecutable.

Saludos!


Título: Re: Ayuda con una modificación que no funciona
Publicado por: arfgh en 7 Julio 2016, 17:29 pm
esa zona es al final de todo. Estás seguro de que la zona de código no se puede escribir ? entonces  por qué con la api 'writeprocessmemory' si que podemos ?

El asunto es que al llegar el ollydbg a esa posición del MOV, no pasa de ahí a la siguiente instrucción...


Título: Re: Ayuda con una modificación que no funciona
Publicado por: tincopasan en 7 Julio 2016, 22:57 pm
la pregunta es
¿porqué querés mover a [4AFA46]? qué es una dirección a la que ya apunta el programa
Citar
Pues bien, cuando intento guardar mi contador con MOV BYTE PTR DS:[4AFA46],AL
si querés guardar Al deberías hacerlo en una dirección libre, como te indico MCKSys


Título: Re: Ayuda con una modificación que no funciona
Publicado por: arfgh en 8 Julio 2016, 00:28 am
el lugar en dónde quiero guardar AL está libre.


Título: Re: Ayuda con una modificación que no funciona
Publicado por: MCKSys Argentina en 8 Julio 2016, 00:47 am
esa zona es al final de todo. Estás seguro de que la zona de código no se puede escribir ? entonces  por qué con la api 'writeprocessmemory' si que podemos ?

El asunto es que al llegar el ollydbg a esa posición del MOV, no pasa de ahí a la siguiente instrucción...

Estás mezclando todo. Como te dije, tienes 2 opciones en tu caso: hacer la sección .code/.text writable o escribir en la sección .data (ésta última es la más sencilla, pues sólo debes cambiar la dirección donde quieres escribir).

Por otro lado, WriteProcessMemory se usa desde otro proceso (normalmente) y no discrimina entre secciones de ejecutables, stack, heap, etc. Basta con que la memoria esté mapeada.

Saludos!

PD: Si hubieras completado la intro a Olly de Ricardo Narvaja no tendrías este tipo de problemas.  :P


Título: Re: Ayuda con una modificación que no funciona
Publicado por: arfgh en 8 Julio 2016, 01:04 am
ya advertí que no entiendo mucho :P
no obstante para escribir en la sección .data, tiene que haber un lugar para poder meter los bytes que necesitamos. 15 bytes es la zona más grande y vacía que he encontrado allí. No siendo que se pudiese hacer ese código más pequeño...

si es que se puede agrandar alguna sección pues ya me diréis como.....


Título: Re: Ayuda con una modificación que no funciona
Publicado por: MCKSys Argentina en 8 Julio 2016, 04:02 am
Si el código que has colocado es todo el código, entonces sólo necesitas 1 byte de la sección .data.
Toma uno del final de la sección y listo.

Saludos!


Título: Re: Ayuda con una modificación que no funciona
Publicado por: arfgh en 8 Julio 2016, 14:59 pm
Amigos la zona .idata imports también es RW y también tiene mucho espacio vacío. Sería factible usar ese espacio con seguridad ?

Es posible programáticamente hacer una sección .rdata con permisos de escritura ? o cualquier otra que no sea RW.

Y también, es posible programaticamente expandir el espacio de una de las secciones y poder así meter nuestro código ?

saludos


Título: Re: Ayuda con una modificación que no funciona
Publicado por: .:UND3R:. en 8 Julio 2016, 16:57 pm
Amigos la zona .idata imports también es RW y también tiene mucho espacio vacío. Sería factible usar ese espacio con seguridad ?

Es posible programáticamente hacer una sección .rdata con permisos de escritura ? o cualquier otra que no sea RW.

Y también, es posible programaticamente expandir el espacio de una de las secciones y poder así meter nuestro código ?

saludos

si, busca por una app que se llama t0po o topo en la web de ricardo narvaja


Título: Re: Ayuda con una modificación que no funciona
Publicado por: arfgh en 8 Julio 2016, 19:35 pm
hombre, herramientas ya me imagino que habrá, el mismo ollydbg te deja escribir en esas partes, pero me refiero .... programaticamente, o sea, desde nuestro propio programa.


Título: Re: Ayuda con una modificación que no funciona
Publicado por: .:UND3R:. en 10 Julio 2016, 02:45 am
hombre, herramientas ya me imagino que habrá, el mismo ollydbg te deja escribir en esas partes, pero me refiero .... programaticamente, o sea, desde nuestro propio programa.

Mujer, para que quieres hacer "programaticamente"? (no sé a que te refieres con eso), Si no puedes hacer una pequeña modificación de un salto condicional, dudo que puedas programar internamente un editor de secciones (si es que a eso te refieres a programaticamente). Mejor usa una tools no te compliques la vida.


Título: Re: Ayuda con una modificación que no funciona
Publicado por: apuromafo CLS en 11 Julio 2016, 05:28 am
leo con tranquilidad que quieres insertar un pequeño injerto

hay ciertos detalles a considerar cuando cambias un byte

1)el programa está empacado?, esto influye porque el lugar donde escribes puede que esté está protegido contra escritura, aunque de comienzo tenga permisos de escritura o bien que tenga verificacion de crc.

2) el programa si no está desempacado la sección que está influye bastante
ya que si no tiene permiso para escribir en el lugar hará una excepción,que hará que no funcione

3) digamos que usas topo
herramienta disponible en http://ricardonarvaja.info/WEB/OTROS/HERRAMIENTAS/Q-R-S-T-U/topo12corregido.rar


 indicado en la parte anterior, determinas no se 100 o 200 bytes de espacio libre o el tamaño que quieras ,tu código será algo asi


Citar
nop
nop
nop
NOp por cantidad de bytes ...
JMP entrypoint



lo ideal que hagas es que coloques en este  entrypoint lleno de nops algo asi


pushad ;guarda los registros
injerto a realizar (cambiar una direccion, redireccionar o lo que quieras)
// cambiar una direccion
ejemplo mov ptr ds:[direccion del salto],90909090 ;nopeando el lugar de destino
mov ptr ds:[direccion del salto+4],bytes  ;siguiendo la escritura de los bytes
mov ptr ds:[direccion del salto],bytes del salto a direccion del destino

la idea de los bytes es para parches a luego del salto del oep
donde antes decia jmp lugar/jne/je, ahora dirá jmp direccion2

popad ;restaura los registros
jmp entrypoint ;aqui empezara el programa....
una vez que acceda al lugar parchado irá a direccion 2 donde devolverás el flujo

direccion2:

aqui codigo que antes era nop, ahora le colocas lo que quieres hacer o cambiar etc
cmp eax,0
je siguiente
mov eax,1
siguiente:
jmp lugar retorno

una idea de injerto cualquiera es definir el espacio donde estamos

osea

entrypoint (con nops)
COdigo que cambia algunas instrucciones hacia el codecave , luego
ejemplo cambio incondicional al lugar de destino (despues de la redireccion del oep)

salto al oep (original entrypoint)
codigo del injerto donde restauras o sigues el flujo normal, parchas donde quieres
y saltas al retorno del programa tal cual como siempre



esto de usar un injerto que no altere las apis, se puede hacer sin lio cuando conoces bien el ejecutable, pero cuando ya requieres apis, debes tener cuidado de agregar a la sección iat las nuevas apis, y de cuadrar bien la sección para que sean compatibles con otros sistemas operativos...

bueno eso


la sugerencia es que si aún no encuentras bien el espacio o como administrarlo, lo ideal es que leas bien el faq y termines los escritos de ricardo narvaja

quizas de primera es complicado, pero con el tiempo comienzas a darte cuenta que no es algo complicado

Saludos Apuromafo