Criando o arquivo executável ELF manualmente

Olá classe, e bem-vindo ao x86 Masochism 101. Aqui você aprenderá como usar opcodes diretamente para criar um executável sem nunca tocar no compilador, assembler ou linker. Usaremos apenas um editor capaz de modificar binários (ou seja, um editor hexadecimal) e “chmod” para tornar o arquivo executável.



Se isso não te excita, então eu nem sei ...



Mas, falando sério, essa é uma daquelas coisas que pessoalmente acho muito interessante. Obviamente, você não vai usar isso para escrever programas sérios com milhões de linhas. No entanto, você pode ter imenso prazer em saber que realmente entende como essas coisas realmente funcionam em um nível inferior. Também é ótimo saber que você escreveu um executável sem nem mesmo tocar no compilador ou interpretador. Além disso, existem aplicativos para programação de kernel, engenharia reversa e (sem surpresa) construção de compiladores.



Primeiramente, vamos dar uma olhada rápida em como a execução de um arquivo ELF realmente funciona. Muitos detalhes serão omitidos. O importante é ter uma boa ideia do que seu computador está fazendo quando você o instrui a executar o binário ELF.





Quando você diz ao computador para executar um binário ELF, a primeira coisa que ele procura são os cabeçalhos ELF correspondentes. Esses cabeçalhos contêm todos os tipos de informações importantes sobre a arquitetura do processador, segmentos e seções de arquivo e muito mais - falaremos sobre isso mais tarde. O cabeçalho também contém informações que ajudam o computador a identificar o arquivo como ELF. Mais importante ainda, o cabeçalho ELF contém informações sobre a tabela de cabeçalho do programa no caso de um arquivo executável e o endereço virtual para o qual o computador transfere o controle quando executado.





, , . - , , «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
      
      



Isso é tudo. Execute chmod + x neste binário e então execute-o. Hello World em 178 bytes. Espero que você tenha gostado de escrever isso. :-) Se você achar este COMO FAZER útil ou interessante, me avise! Eu sempre aprecio isso. Além disso, conselhos, comentários e / ou críticas construtivas são sempre bem-vindos.








All Articles