Foro de elhacker.net

Programación => Ingeniería Inversa => Mensaje iniciado por: Tinkipinki en 22 Septiembre 2011, 20:16 pm



Título: Duda sobre ejecutables
Publicado por: Tinkipinki en 22 Septiembre 2011, 20:16 pm
Hola a todos:
No se si este sera el foro adecuado para esta consulta pero bueno lo intentamos.

En un ejecutable quien decide todos los parametros de Image Base, Entry Point,
o sea , todos los parametros que podemos ver en el LordPE.
Mi duda es si todo debe seguir estas diractrices, o sea que fuera una configuracion estandard y que por ejemplo yo no pudiera tener un programa con una ImageBase por ejemplo en 00003000 en vez de 00400000.
Otra pregunta seria quien decide las direcciones de memoria a las que debe ir el programa al cargarse en la memoria, o sea las direcciones de memoria que nos aparecen al hacer un dump del programa.

Saludos


Título: Re: Duda sobre ejecutables
Publicado por: Shaddy en 22 Septiembre 2011, 21:46 pm
Hola a todos:
No se si este sera el foro adecuado para esta consulta pero bueno lo intentamos.

En un ejecutable quien decide todos los parametros de Image Base, Entry Point,
o sea , todos los parametros que podemos ver en el LordPE.
Mi duda es si todo debe seguir estas diractrices, o sea que fuera una configuracion estandard y que por ejemplo yo no pudiera tener un programa con una ImageBase por ejemplo en 00003000 en vez de 00400000.
Otra pregunta seria quien decide las direcciones de memoria a las que debe ir el programa al cargarse en la memoria, o sea las direcciones de memoria que nos aparecen al hacer un dump del programa.

Saludos

Esos parámetros generalmente vienen definidos por el compilador. Pero los puedes crear a mano, más que parámetros podríamos llamarles reglas.

En primer lugar tenemos la cabecera 'MZ' IMAGE_DOS_HEADER que sería esta:

Código:
typedef struct _IMAGE_DOS_HEADER
{
     WORD e_magic;
     WORD e_cblp;
     WORD e_cp;
     WORD e_crlc;
     WORD e_cparhdr;
     WORD e_minalloc;
     WORD e_maxalloc;
     WORD e_ss;
     WORD e_sp;
     WORD e_csum;
     WORD e_ip;
     WORD e_cs;
     WORD e_lfarlc;
     WORD e_ovno;
     WORD e_res[4];
     WORD e_oemid;
     WORD e_oeminfo;
     WORD e_res2[10];
     LONG e_lfanew;
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

Luego ya tienes la de sistemas 'NT' (elfa_new apunta a ella) IMAGE_NT_HEADERS:

Código:
typedef struct _IMAGE_NT_HEADERS
{
     ULONG Signature;
     IMAGE_FILE_HEADER FileHeader;
     IMAGE_OPTIONAL_HEADER OptionalHeader;
} IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;

Donde:

Código:
	
struct IMAGE_FILE_HEADER

typedef struct _IMAGE_FILE_HEADER
{
     WORD Machine;
     WORD NumberOfSections;
     ULONG TimeDateStamp;
     ULONG PointerToSymbolTable;
     ULONG NumberOfSymbols;
     WORD SizeOfOptionalHeader;
     WORD Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;


Código:
typedef struct _IMAGE_OPTIONAL_HEADER
{
     WORD Magic;
     UCHAR MajorLinkerVersion;
     UCHAR MinorLinkerVersion;
     ULONG SizeOfCode;
     ULONG SizeOfInitializedData;
     ULONG SizeOfUninitializedData;
     ULONG AddressOfEntryPoint;
     ULONG BaseOfCode;
     ULONG BaseOfData;
     ULONG ImageBase;
     ULONG SectionAlignment;
     ULONG FileAlignment;
     WORD MajorOperatingSystemVersion;
     WORD MinorOperatingSystemVersion;
     WORD MajorImageVersion;
     WORD MinorImageVersion;
     WORD MajorSubsystemVersion;
     WORD MinorSubsystemVersion;
     ULONG Win32VersionValue;
     ULONG SizeOfImage;
     ULONG SizeOfHeaders;
     ULONG CheckSum;
     WORD Subsystem;
     WORD DllCharacteristics;
     ULONG SizeOfStackReserve;
     ULONG SizeOfStackCommit;
     ULONG SizeOfHeapReserve;
     ULONG SizeOfHeapCommit;
     ULONG LoaderFlags;
     ULONG NumberOfRvaAndSizes;
     IMAGE_DATA_DIRECTORY DataDirectory[16];
} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;

Ahora, sobre la pregunta de si necesita estar en la base 0x00400000 la respuesta es: No.

No es necesario, el Sistema Operativo siempre da prioridad al ImageBase, pero en caso de no poder mapearse en esa zona de memoria lo situaría en una página sin reservar.

El caso más fácil de ver son por ejemplo las librerías, la mayoría de ellas intentan mapearse en 0x01000000 pero si te fijas en tu debugger favorito verás que siempre se van alojando de forma contigua.

En cuánto a la última pregunta deberías definir a qué secciones te refieres. Si es a la parte de las secciones (IMAGE_SECTION_HEADER) como ".text"/".data"/etc entonces el header del binario es el que lo define.

Ahora si me preguntas sobre el resto de direcciones quitando las que reservan las librerías tienes las páginas de Stack y contextos (PEB y TEB) en los últimos 100K de los 2GB.

El resto son páginas que se reservan para generar memoria (y devolver heaps).

Un saludo.



Título: Re: Duda sobre ejecutables
Publicado por: Иōҳ en 23 Septiembre 2011, 00:22 am

Luego ya tienes la de sistemas 'NT' (elfa_new apunta a ella) IMAGE_NT_HEADERS:


Error de tipografía es e_lfanew   :laugh:

ohh.. shaddy volvistes por estos lares :P, sin duda un 3lit3...  ;D

Citar
Ahora, sobre la pregunta de si necesita estar en la base 0x00400000 la respuesta es: No.

No es necesario, el Sistema Operativo siempre da prioridad al ImageBase, pero en caso de no poder mapearse en esa zona de memoria lo situaría en una página sin reservar.

El caso más fácil de ver son por ejemplo las librerías, la mayoría de ellas intentan mapearse en 0x01000000 pero si te fijas en tu debugger favorito verás que siempre se van alojando de forma contigua.

Si no me equivoco a la hroa de linkear puedes cambiar eso...


Citar
Ahora si me preguntas sobre el resto de direcciones quitando las que reservan las librerías tienes las páginas de Stack y contextos (PEB y TEB) en los últimos 100K de los 2GB.

El resto son páginas que se reservan para generar memoria (y devolver heaps).

Aparte de lo que te dijo Shaddy:

Cada programa tiene sus 4GB  de memoria en el espacio de direcciones, eso no quiere decir que ocupen 4gb de memoria física, si no que el programa puede direccionar cualquier dirección en ese rango.

Nox.


Título: Re: Duda sobre ejecutables
Publicado por: Tinkipinki en 23 Septiembre 2011, 05:23 am
Gracias Shaddy y Иōҳ por vuestras respuestas.
Con esto ya me queda mas claro lo del mapeado de la memoria.
Mi duda era si podia generar un programa con las abeceras bien definidas pero mapeado en unas direcciones fura de las que se usan por costumbre y claro esta, que luego el procesador lo entendiease y el programa funcionara.
Sabiendo que estos parametros los puedo definir en el linkador ya puedo hacer pruebas.

Saludos


Título: Re: Duda sobre ejecutables
Publicado por: Shaddy en 23 Septiembre 2011, 09:05 am
Aparte de lo que te dijo Shaddy:

Cada programa tiene sus 4GB  de memoria en el espacio de direcciones, eso no quiere decir que ocupen 4gb de memoria física, si no que el programa puede direccionar cualquier dirección en ese rango.

Nox.

Bueno, eso en realidad no es cierto. En arquitecturas x86 (32-Bit) el máximo de memoria virtual por proceso son 2 GB (0x00000000-0x7FFFFFFF).

Gracias Shaddy y Иōҳ por vuestras respuestas.
Con esto ya me queda mas claro lo del mapeado de la memoria.
Mi duda era si podia generar un programa con las abeceras bien definidas pero mapeado en unas direcciones fura de las que se usan por costumbre y claro esta, que luego el procesador lo entendiease y el programa funcionara.
Sabiendo que estos parametros los puedo definir en el linkador ya puedo hacer pruebas.

Saludos

Puedes definirlos en el 'linker' o puedes definirlos a mano, como ya te dije ImageBase lo puedes cambiar manualmente.

Un saludo.


Título: Re: Duda sobre ejecutables
Publicado por: Иōҳ en 23 Septiembre 2011, 19:50 pm
Bueno, eso en realidad no es cierto. En arquitecturas x86 (32-Bit) el máximo de memoria virtual por proceso son 2 GB (0x00000000-0x7FFFFFFF).


Iczellion  me angaño ._.

En mi experiencia tocando juegos, llege a encontrar direcciones 0xEXXXXXXX, y tomando aquellas para hacer uno que otro cheat...

Entonces a leer a Iczellion, no dude en creerle  :-\

Nox.


Título: Re: Duda sobre ejecutables
Publicado por: Shaddy en 24 Septiembre 2011, 00:08 am
Estarías en un entorno de 64-Bit o expresamente configurado para que el kernel tenga sólamente 1 GB. Aunque ya te digo que muy raro sería ;).

Un saludo.


Título: Re: Duda sobre ejecutables
Publicado por: Иōҳ en 24 Septiembre 2011, 00:36 am
Vale, lo entiendo, yo pensaba que este temilla estaba totalmente correcto en mi cabeza, luego vienen y te dicen que no XD

 :laugh:

Pero en arquitecturas x64 entonces, tienen 4gb de memoria en el espacio de direcciones?
Nox.


Título: Re: Duda sobre ejecutables
Publicado por: .:UND3R:. en 24 Septiembre 2011, 16:09 pm
Leyendo un estudio de PE me topé con esto:
Sick Troen:
Citar
•   Magic  0B 01 ; esto nos dice que es un PE32, a diferencia del 0B 02 que es el PE32+ (estas limitan nuestra imagen hasta 4gb!).

PE32 32 byte y el de 64 comentan que el límite es de 4gb

Optional Header
campos estandar
MagicNumber:puede ser P32 o P32+

la diferencia:

Citar
The PE32 format stands for Portable Executable 32-bit, while PE32+ is Portable Executable 64-bit format.

Saludos


Título: Re: Duda sobre ejecutables
Publicado por: Shaddy en 24 Septiembre 2011, 21:22 pm
Vale, lo entiendo, yo pensaba que este temilla estaba totalmente correcto en mi cabeza, luego vienen y te dicen que no XD

 :laugh:

Pero en arquitecturas x64 entonces, tienen 4gb de memoria en el espacio de direcciones?
Nox.

No, en x64 tienes hasta 256 TeraBytes ;).

Un saludo.


Título: Re: Duda sobre ejecutables
Publicado por: Shaddy en 24 Septiembre 2011, 21:25 pm
Leyendo un estudio de PE me topé con esto:
Sick Troen:
PE32 32 byte y el de 64 comentan que el límite es de 4gb

Optional Header
campos estandar
MagicNumber:puede ser P32 o P32+

la diferencia:

Saludos

Tú ten en cuenta que el sistema reserva 2 GB para el kernel. Yo no sé si habéis depurado el kernel alguna vez. Pero me resulta difícil pensar que virtualmente usen un rango de 0x00000000-0x7fffffffff (2GB) y en el kernel a partir de 0x80000000 y luego puedas usar esos 2 GB para código que no sea kernel.

Tú solamente piensa en las librerías / drivers / etc. que van gestionando el sistema. ¿Dónde es mejor que se ejecuten, desde la RAM o desde la paginación?

Un saludo.


Título: Re: Duda sobre ejecutables
Publicado por: Shaddy en 24 Septiembre 2011, 21:28 pm
Por aquí hay un artículo donde explica la memoria total (que no la memoria de user-land) en diferentes arquitecturas:

http://support.microsoft.com/kb/294418

Dicen que en x64 son 16 Terabytes. Yo juraría recordar que era 256 tb pero bueno.

Un saludo.


Título: Re: Duda sobre ejecutables
Publicado por: Иōҳ en 24 Septiembre 2011, 22:08 pm
¿Dónde es mejor que se ejecuten, desde la RAM o desde la paginación?

Un saludo.

Según lo que leí en el link, sería desde la ram?, si me equivoque es porque no lo tengo tan claro aún... :P


Citar
Los programas de 32 bits también utilizan el modelo de túnel de 4 GB (2 GB para Usuario y 2 GB para Kernel). Esto significa que los procesos de 32 bits que se ejecutan en versiones de Windows de 64 bits se ejecutan en un modelo de túnel de 4 GB (2 GB para Usuario y 2 GB para Kernel).

Osea al referercide 4GB lo dicen en conjunto, pero lo que se debe especificar es que 2 solo pueden ser para el usuario, y lo restante (2gb), son para el kernel.

Creo que voy entendiendo...  ;D

Pd: Under te mande un MP te llego?

Saludos!
Nox.


Título: Re: Duda sobre ejecutables
Publicado por: .:UND3R:. en 25 Septiembre 2011, 06:40 am
Según lo que leí en el link, sería desde la ram?, si me equivoque es porque no lo tengo tan claro aún... :P


Osea al referercide 4GB lo dicen en conjunto, pero lo que se debe especificar es que 2 solo pueden ser para el usuario, y lo restante (2gb), son para el kernel.

Creo que voy entendiendo...  ;D

Pd: Under te mande un MP te llego?

Saludos!
Nox.

el para el hackshield? ese sí. te envio mi mail :D


Título: Re: Duda sobre ejecutables
Publicado por: Tinkipinki en 25 Septiembre 2011, 11:55 am
Hola a todos
Para quien le interese leer un poco os dejo los links de descarga del tutorial de
Sick Troen que hacia referencia .:UND3R:.
Para los que sigan este hilo y se inicien en el tema creo que vale la pena darles un vistazo.

http://dc399.4shared.com/download/lvmh7dC-/044-ESTUDIO_DE_LOS_ENCABEZADOS.zip?tsid=20110925-093526-632c6108 (http://dc399.4shared.com/download/lvmh7dC-/044-ESTUDIO_DE_LOS_ENCABEZADOS.zip?tsid=20110925-093526-632c6108)

http://dc129.4shared.com/download/LEzqnx-Y/048-ESTUDIO_DE_LOS_ENCABEZADOS.zip?tsid=20110925-093607-f855d31 (http://dc129.4shared.com/download/LEzqnx-Y/048-ESTUDIO_DE_LOS_ENCABEZADOS.zip?tsid=20110925-093607-f855d31)

Saludos


Título: Re: Duda sobre ejecutables
Publicado por: .:UND3R:. en 25 Septiembre 2011, 17:34 pm
Hola a todos
Para quien le interese leer un poco os dejo los links de descarga del tutorial de
Sick Troen que hacia referencia .:UND3R:.
Para los que sigan este hilo y se inicien en el tema creo que vale la pena darles un vistazo.

http://dc399.4shared.com/download/lvmh7dC-/044-ESTUDIO_DE_LOS_ENCABEZADOS.zip?tsid=20110925-093526-632c6108 (http://dc399.4shared.com/download/lvmh7dC-/044-ESTUDIO_DE_LOS_ENCABEZADOS.zip?tsid=20110925-093526-632c6108)

http://dc129.4shared.com/download/LEzqnx-Y/048-ESTUDIO_DE_LOS_ENCABEZADOS.zip?tsid=20110925-093607-f855d31 (http://dc129.4shared.com/download/LEzqnx-Y/048-ESTUDIO_DE_LOS_ENCABEZADOS.zip?tsid=20110925-093607-f855d31)

Saludos


Excelente aporte. Saludos


Título: Re: Duda sobre ejecutables
Publicado por: Shaddy en 26 Septiembre 2011, 09:56 am
Según lo que leí en el link, sería desde la ram?, si me equivoque es porque no lo tengo tan claro aún... :P


Osea al referercide 4GB lo dicen en conjunto, pero lo que se debe especificar es que 2 solo pueden ser para el usuario, y lo restante (2gb), son para el kernel.

Creo que voy entendiendo...  ;D

Pd: Under te mande un MP te llego?

Saludos!
Nox.

Es código que se ejecuta más veces. Y en líneas generales cualquier acceso a memoria es preferente que se haga sobra la RAM. (Es más rápido).

Yo no diría que un proceso puede ocupar 4 GB. Básicamente porque un proceso es una estructura EPROCESS que tiene asignados 2 GB de espacio usuario (como siempre, por defecto ;)...)

Un saludo.


Título: Re: Duda sobre ejecutables
Publicado por: Shaddy en 26 Septiembre 2011, 09:58 am
Hola a todos
Para quien le interese leer un poco os dejo los links de descarga del tutorial de
Sick Troen que hacia referencia .:UND3R:.
Para los que sigan este hilo y se inicien en el tema creo que vale la pena darles un vistazo.

http://dc399.4shared.com/download/lvmh7dC-/044-ESTUDIO_DE_LOS_ENCABEZADOS.zip?tsid=20110925-093526-632c6108 (http://dc399.4shared.com/download/lvmh7dC-/044-ESTUDIO_DE_LOS_ENCABEZADOS.zip?tsid=20110925-093526-632c6108)

http://dc129.4shared.com/download/LEzqnx-Y/048-ESTUDIO_DE_LOS_ENCABEZADOS.zip?tsid=20110925-093607-f855d31 (http://dc129.4shared.com/download/LEzqnx-Y/048-ESTUDIO_DE_LOS_ENCABEZADOS.zip?tsid=20110925-093607-f855d31)

Saludos


Respeto mucho el trabajo que hizo Sick Troen en su día. Sin embargo, me atrevería a decir que lo mejor para estudiar un formato es utilizar su documentación oficial.

Y lo tenéis aquí:

http://download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/pecoff_v8.docx (http://download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/pecoff_v8.docx)

Un saludo.


Título: Re: Duda sobre ejecutables
Publicado por: Tinkipinki en 26 Septiembre 2011, 11:56 am
Hay que ver lo que puede dar de si un simple post y se agradece muchisimo todo el tiempo que uno invierte en responder y documentar temas.
Esto es un ejemplo para todos los que se inician en el crancking y leen a diario el foro para encontrar un nuevo reto, no todo es sacar serials, esto tambien reversing ... ;)

Saludos