Creación manual del archivo ejecutable ELF

Hola clase y bienvenidos a x86 Masochism 101. Aquí aprenderá cómo usar códigos de operación directamente para crear un ejecutable sin tocar el compilador, ensamblador o enlazador. Solo usaremos un editor capaz de modificar binarios (es decir, un editor hexadecimal) y "chmod" para hacer que el archivo sea ejecutable.



Si eso no te enciende, entonces ni siquiera lo sé ...



En serio, sin embargo, esta es una de esas cosas que personalmente encuentro muy interesantes. Obviamente, no lo usará para escribir programas serios con millones de líneas. Sin embargo, puede tener un inmenso placer al saber que realmente comprende cómo funcionan realmente estas cosas en un nivel bajo. También es genial poder decir que escribiste un ejecutable sin siquiera tocar el compilador o el intérprete. Además, existen aplicaciones para la programación del núcleo, la ingeniería inversa y (como era de esperar) la construcción de compiladores.



En primer lugar, echemos un vistazo rápido a cómo funciona realmente la ejecución de un archivo ELF. Se omitirán muchos detalles. Lo importante es tener una buena idea de lo que está haciendo su computadora cuando le dice que ejecute el binario ELF.





Cuando le dice a la computadora que ejecute un binario ELF, lo primero que buscará son los encabezados ELF correspondientes. Estos encabezados contienen todo tipo de información importante sobre la arquitectura del procesador, segmentos de archivos y secciones, y más; hablaremos de eso más adelante. El encabezado también contiene información que ayuda a la computadora a identificar el archivo como ELF. Lo más importante es que el encabezado ELF contiene información sobre la tabla de encabezado del programa en el caso de un archivo ejecutable y la dirección virtual a la que la computadora transfiere el control cuando se ejecuta.





, , . - , , «text» «data», . , , .





, , , ELF, .





, , , ELF x86. - Bless. Linux, ELF . Unix- , -, . , . Windows, . , x86 ( x86_64 ), .





ELF . (payload), . -, ELF program header table, . , , , .





: ELF . , , , , , . (: ) , « -» « », . !





, , . "Hello World!" , 93. , . ( ), ( «Hello World!» ). , :





(text segment)
mov ebx, 1
mov eax, 4
mov ecx, HWADDR
mov edx, HWLEN
int 0x80

mov eax, 1
mov ebx, 0x5D
int 0x80
      
      



, . 0x80 , EAX EBX , . .





. , -, . x86 , , :





0xBB 0x01 0x00 0x00 0x00
0xB8 0x04 0x00 0x00 0x00
0xB9 0x** 0x** 0x** 0x**
0xBA 0x0D 0x00 0x00 0x00
0xCD 0x80

0xB8 0x01 0x00 0x00 0x00
0xBB 0x5D 0x00 0x00 0x00 
0xCD 0x80
      
      



( . , )





, «Hello World!\n». ASCII ('man ascii'), , , :





(data segment)
0x48 0x65 0x6C 0x6C 0x6F 0x20 0x57 0x6F 0x72 0x6C 0x64 0x21 0x0A
      
      



!





. , , , , - ELF . ELF , :





e_ident(16), e_type(2), e_machine(2), e_version(4), e_entry(4), e_phoff(4),
e_shoff(4), e_flags(4), e_ehsize(2), e_phentsize(2), e_phnum(2), e_shentsize(2)
e_shnum(2), e_shstrndx(2)
      
      



, , .





e_ident (16) - 16 , ELF. 0x7F, 'E', L ', F'. 0x01 32- little-endian. , 0x00, , 16 (= 0x10).





e_type (2) - 0x02 0x00. , , ELF.





e_machine (2) - 0x03 0x00, , ELF i386.





e_version (4) - 0x01 0x00 0x00 0x00.





e_entry (4) - . , 0x** 0x** 0x** 0x**.





e_phoff (4) - program header table. ELF, ELF : 0x34 0x00 0x00 0x00.





e_shoff (4) - . . 0x00 0x00 0x00 0x00.





e_flags (4) - . 0x00 0x00 0x00 0x00 .





e_ehsize (2) - ELF, 0x34 0x00.





e_phentsize (2) - . , , 0x20 0x00. , , .





e_phnum (2) - , . , 0x02 0x00.





e_shentsize (2), e_shnum (2), e_shstrndx (2) - , ( ), 0x00 0x00 0x00 0x00 0x00 0x00.





ELF! , , , :





0x7F 0x45 0x4C 0x46 0x01 0x01 0x01 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x10 0x02 0x00 0x03 0x00 0x01 0x00 0x00 0x00
0x** 0x** 0x** 0x** 0x34 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x00 0x34 0x00 0x20 0x00 0x02 0x00 0x00 0x00
0x00 0x00 0x00 0x00
      
      



. program header table. :





p_type(4), p_offset(4), p_vaddr(4), p_paddr(4), p_filesz(4), p_memsz(4),
p_flags(4), p_align(4)
      
      



, ( : , ) :





p_type (4) - . , PT_LOAD (= 0x01 0x00 0x00 0x00).





p_offset (4) - . , , . 0x** 0x** 0x** 0x**.





p_vaddr (4) - . 0x** 0x** 0x** 0x** 0x**, .





p_paddr (4) - , 0x00 0x00 0x00 0x00.





p_filesz (4) - , . , 0x** 0x** 0x** 0x**. .





p_memsz (4) - . , p_filesz, . 0x** 0x** 0x** 0x**, , , p_filesz.





p_flags (4) - , . , , READ - 0x04, WRITE - 0x02, EXEC - 0x01. READ + EXEC, 0x05 0x00 0x00 0x00, READ + WRITE + EXEC, 0x07 0x00 0x00 0x00.





p_align (4) - . 4 , 0x1000. , x86 little-endian, 0x00 0x10 0x00 0x00.





. , , . , ELF, . , (, , ELF - ?) :





0x01 0x00 0x00 0x00 0x** 0x** 0x** 0x** 0x** 0x** 0x** 0x**
0x00 0x00 0x00 0x00 0x** 0x** 0x** 0x** 0x** 0x** 0x** 0x**
0x05 0x00 0x00 0x00 0x00 0x10 0x00 0x00 
0x01 0x00 0x00 0x00 0x** 0x** 0x** 0x** 0x** 0x** 0x** 0x**
0x00 0x00 0x00 0x00 0x** 0x** 0x** 0x** 0x** 0x** 0x** 0x**
0x07 0x00 0x00 0x00 0x00 0x10 0x00 0x00
      
      



, . ELF , , , - , , . , .



-, , - . . ELF 116 + 2 , 116 = 0x74, 0x74. , 0x80. 0x74 0x7F 0x00, 0x80 .





34 = 0x22 , , 0x80 + 0x22 = 0xA2. 0xA4 0xA2 0xA3 0x00.





, , ELF, 0x00 0x73, 0x74 0x7F , 0x80 0xA1, 0xA2 0xA3 , 0xA4 0xB0. , , , .





, , . , , .





e_entry (4) - 0x80 0x80 0x04 0x08; 0x8048080 . , , , , , - , . ELF , , .





p_offset (4) - 0x80 0x00 0x00 0x00 , 0xA4 0x00 0x00 0x00 . - , .





p_vaddr (4) - 0x80 0x80 0x04 0x08 , 0xA4 0x80 0x04 0x08 . , , , .





p_filesz (4) - 0x24 0x00 0x00 0x00 , 0x20 0x00 0x00 0x00 . . p_memsz = p_filesz, .





, , :





7F 45 4C 46 01 01 01 00 00 00 00 00 00 00 00 10 02 00 03 00
01 00 00 00 80 80 04 08 34 00 00 00 00 00 00 00 00 00 00 00
34 00 20 00 02 00 00 00 00 00 00 00 01 00 00 00 80 00 00 00
80 80 04 08 00 00 00 00 24 00 00 00 24 00 00 00 05 00 00 00
00 10 00 00 01 00 00 00 A4 00 00 00 A4 80 04 08 00 00 00 00
20 00 00 00 20 00 00 00 07 00 00 00 00 10 00 00 00 00 00 00
00 00 00 00 00 00 00 00 BB 01 00 00 00 B8 04 00 00 00 B9 A4
80 04 08 BA 0D 00 00 00 CD 80 B8 01 00 00 00 BB 2A 00 00 00
CD 80 00 00 48 65 6C 6C 6F 20 57 6F 72 6C 64 21 0A
      
      



Eso es todo. Ejecute chmod + x en este binario y luego ejecútelo. Hola mundo en 178 bytes. Espero que hayas disfrutado escribiendo esto. :-) Si encuentra este CÓMO útil o interesante, ¡hágamelo saber! Siempre lo agradezco. Además, los consejos, comentarios y / o críticas constructivas son siempre bienvenidos.








All Articles