[Taller en construcción]Secciones en archivos PE.

Iniciado por The Swash, 23 Mayo 2012, 18:44 PM

0 Miembros y 2 Visitantes están viendo este tema.

COND0R

#50
Muy bueno tu tutorial!! gracias a vos me inicie en la infectacion de PEs!!


PD: El tamaño de Characteristics en IMAGE_FILE_HEADER es de 2 bytes no de 4, aqui tienen la web de microsoft (http://msdn.microsoft.com/en-us/library/ms809762.aspx)
donde aparece el tamaño  ;D
El lenguaje global tendría que ser C++ xD...

COND0R

Tengo una duda... AddressOfEntryPoint es la direccion relativa donde empieza el codigo? si lo cambio por la direccion de mi sección... empesaria el programa en mi sección de codigo?? y si fuera asi luego de ejecutar mi codigo malisioso puedo hacer un salto a la sección .text donde esta el codigo del programa?? gracias de antemano  :rolleyes:
El lenguaje global tendría que ser C++ xD...

limiaspasdaniel

Hola.. perdonar por reabrir el tema pero he estado mirando y no me queda claro lo del 0x17 , porque exactamente ese tamaño? De verdad que me he repasado el Taller unas cuantas veces y no encuentro el porque. Muchas gracias :D

Danyfirex

Cita de: limiaspasdaniel en 29 Agosto 2013, 14:36 PM
Hola.. perdonar por reabrir el tema pero he estado mirando y no me queda claro lo del 0x17 , porque exactamente ese tamaño? De verdad que me he repasado el Taller unas cuantas veces y no encuentro el porque. Muchas gracias :D

porque el es tamaño que tiene la cadena TALLER DE SECCIONES EHN

23 decimal = 0x17 Hexadecimal.

saludos

magicboiz

#54
Hola "The Swash"

soy un novatillo en esto. El caso es que me estoy haciendo un script en python para "expandir" la sección .text, y siguiendo tus pasos (que seguramente no los haya seguido al 100%) no me funciona.

El problema que me encuentro, es que los DATA_DIRECTORIES que hay dentro del PE, hacen referencia a distintas secciones (.data, .idata, .rss, etc) que claro, al verse desplazadas por el incremento de .text, pues cambian sus direcciones. Eso por no hablar de los jodido que es navegar por dentro de los resource directories, sus subdirectorios....

¿Qué pista me das para resolver este tema de los DATA_DIRECTORIES y las refencias a las secciones?


gracias majo.

x64core

Cita de: magicboiz en 17 Enero 2014, 11:06 AM
Hola "The Swash"

soy un novatillo en esto. El caso es que me estoy haciendo un script en python para "expandir" la sección .text, y siguiendo tus pasos (que seguramente no los haya seguido al 100%) no me funciona.

El problema que me encuentro, es que los DATA_DIRECTORIES que hay dentro del PE, hacen referencia a distintas secciones (.data, .idata, .rss, etc) que claro, al verse desplazadas por el incremento de .text, pues cambian sus direcciones. Eso por no hablar de los jodido que es navegar por dentro de los resource directories, sus subdirectorios....

¿Qué pista me das para resolver este tema de los DATA_DIRECTORIES y las refencias a las secciones?


gracias majo.

Para expandir la sección de codigo ( .text normalmente ) que es la primera sección además, y que la imagen del ejecutable quede totalmente funcional debes de incrementar a todos campos en el PE header,instrucciones que hacen referencia a las posteriores secciones de la sección objectivo el valor a incrementar a la sección alineado por SectionAlignement. Un simple ejemplo, Tenemos una imagen PE que contiene dos secciones ( .text y .data ):



        Virtual size    Virtual address     Raw size    Raw Offset
.text   0x1000          0x1000              0x1000      0x400
.data   0x1000          0x2000              0x1000      0x1400


Así, si incrementados 0x1000 bytes a la sección de codigo (.text) debes actualizar todas las secciones posteriores a esta, en este caso solo es .data.
de lo contrario se estaria generando una malformacion en la estructura ya que la primera sección tendria un nuevo tamaño de 0x2000 bytes y la sección .data se supondria que estaria cargandose desde la direccion 0x2000 lo cual es incorrecto. así debemos actualizar el Campo Virtual Address de la sección .data ( 0x2000 ) y sumarle ese valor alineado ( 0x1000 ) quedando como resultado 0x3000. Con eso actualizamos los IMAGE_SECTION_HEADER's pero en
la imagen del PE no solo se deben actualizar esas estructuras sino también DATA_DIRECTORIES->VirtualAddress, y todas las referencias que se hagan en la sección objetivo a las posteriores secciónes, por ejemplo si en la sección .text existe un instruccion como esta:

PUSH dword ptr [0x2000]

Lo cual "pushearia" los primeros cuatro bytes de la sección .data entonces tambíen se tendria que actualizar esta instrucción y todas las instrucciones que hacen referencia como dije antes. Realmente esto no es una tarea facil ya que se require una reprogramación total de la imagen y analisis del codigo tomando en cuenta además punteros a punteros:

MOV eax, dword ptr [0x2000] ; 0x2000 = 0x2000
XXX Reg,dword ptr [eax+Off]
XXX Reg,dword ptr [eax+Off]
....

Lo que podria ayudar es si la imagen PE tiene tabla de relocalización asi de evita el analisis de codigo en busca de referencias a las posteriores secciones,
así tomando la tabla de relocalización y actualizandola. A pesar de eso no realmente asegura que se obtendra una imagen totalmente funcional ya que
si el programa no esta bien estructura y por alguna razon toma en cuenta cierto campos de la imagen del PE que han sido modificados entonces tambien se tendrian que actualizar. A pesar de todo eso puedo decir que es posible.












MixGammers


magicboiz

x64Core

gracias por tu respuesta. Estoy intentando añadir el espacio al final de la sección .text, por lo que el código entiendo que no debiera presentar problemas no? ¿O me podría encontrar código ejecutable en las secciones .data/.idata/.rsc/etc?

Mi objetivo es simplemente hacer un hueco grande al final de la sección .text.

¿Cómo lo ves?


Cita de: x64Core en 17 Enero 2014, 21:09 PM
Para expandir la sección de codigo ( .text normalmente ) que es la primera sección además, y que la imagen del ejecutable quede totalmente funcional debes de incrementar a todos campos en el PE header,instrucciones que hacen referencia a las posteriores secciones de la sección objectivo el valor a incrementar a la sección alineado por SectionAlignement. Un simple ejemplo, Tenemos una imagen PE que contiene dos secciones ( .text y .data ):



        Virtual size    Virtual address     Raw size    Raw Offset
.text   0x1000          0x1000              0x1000      0x400
.data   0x1000          0x2000              0x1000      0x1400


Así, si incrementados 0x1000 bytes a la sección de codigo (.text) debes actualizar todas las secciones posteriores a esta, en este caso solo es .data.
de lo contrario se estaria generando una malformacion en la estructura ya que la primera sección tendria un nuevo tamaño de 0x2000 bytes y la sección .data se supondria que estaria cargandose desde la direccion 0x2000 lo cual es incorrecto. así debemos actualizar el Campo Virtual Address de la sección .data ( 0x2000 ) y sumarle ese valor alineado ( 0x1000 ) quedando como resultado 0x3000. Con eso actualizamos los IMAGE_SECTION_HEADER's pero en
la imagen del PE no solo se deben actualizar esas estructuras sino también DATA_DIRECTORIES->VirtualAddress, y todas las referencias que se hagan en la sección objetivo a las posteriores secciónes, por ejemplo si en la sección .text existe un instruccion como esta:

PUSH dword ptr [0x2000]

Lo cual "pushearia" los primeros cuatro bytes de la sección .data entonces tambíen se tendria que actualizar esta instrucción y todas las instrucciones que hacen referencia como dije antes. Realmente esto no es una tarea facil ya que se require una reprogramación total de la imagen y analisis del codigo tomando en cuenta además punteros a punteros:

MOV eax, dword ptr [0x2000] ; 0x2000 = 0x2000
XXX Reg,dword ptr [eax+Off]
XXX Reg,dword ptr [eax+Off]
....

Lo que podria ayudar es si la imagen PE tiene tabla de relocalización asi de evita el analisis de codigo en busca de referencias a las posteriores secciones,
así tomando la tabla de relocalización y actualizandola. A pesar de eso no realmente asegura que se obtendra una imagen totalmente funcional ya que
si el programa no esta bien estructura y por alguna razon toma en cuenta cierto campos de la imagen del PE que han sido modificados entonces tambien se tendrian que actualizar. A pesar de todo eso puedo decir que es posible.













x64core

Cita de: magicboiz en 20 Enero 2014, 15:14 PM
x64Core

gracias por tu respuesta. Estoy intentando añadir el espacio al final de la sección .text, por lo que el código entiendo que no debiera presentar problemas no? ¿O me podría encontrar código ejecutable en las secciones .data/.idata/.rsc/etc?

Mi objetivo es simplemente hacer un hueco grande al final de la sección .text.

¿Cómo lo ves?



Todo depende de como sea la estructura del diseño del programa y sí yo podria facilmente almacenar código/bytes en cualquier sección
y tener un puntero/dirección absoluta que indicara el inicio del código o bien guiandome en la estructura PE y tener un offset hacia el código.
De hecho la primera opción es bien usada por los compiladores cuando almacenamos datos y hacemos referencia a ellos desde la sección de código.
La segunda podria ser implementada por el programador, por lo que todo estos asuntos debes de estar considerando a la hora de modificar las secciónes de lo
contrario generarias una imagen del PE invalidad.

kisk

Buenas alguien sabe que archivo uso The Swash en la pirmera parte dice que es un archivo que pesa 1.5kb alguien sabe si uso c++( si usaron c++ como hizo un archivo tan pequeño ) y la api MessageBoxA o fasm? gracias
Saludos
La vieja escuela me da nostalgia la nueva me da naucias dime cual es la escuela si ambas me deprimen (8)