ELF実行可能ファイルを手動で作成する

こんにちはクラス、そしてx86マゾヒズム101へようこそ。ここでは、コンパイラ、アセンブラ、またはリンカに触れることなく、オペコードを直接使用して実行可能ファイルを作成する方法を学習します。ファイルを実行可能にするために、バイナリを変更できるエディタ(つまり、16進エディタ)と「chmod」のみを使用します。



それがあなたをオンにしないなら、私も知りません...



真面目な話ですが、これは私が個人的に非常に興味深いと思うものの1つです。明らかに、これを使用して数百万行の深刻なプログラムを作成することはありません。ただし、これらが実際に低レベルでどのように機能するかを本当に理解していることを学ぶことは、非常に喜ばしいことです。また、コンパイラーやインタープリターに触れることなく、実行可能ファイルを作成したことがわかるのも素晴らしいことです。さらに、カーネルプログラミング、リバースエンジニアリング、および(当然のことながら)コンパイラ構築用のアプリケーションがあります。



まず、ELFファイルの実行が実際にどのように機能するかを簡単に見てみましょう。多くの詳細は省略されます。重要なのは、ELFバイナリを実行するように指示したときに、コンピューターが何をしているかをよく理解することです。





ELFバイナリを実行するようにコンピュータに指示すると、最初に検索されるのは、対応するELFヘッダーです。これらのヘッダーには、プロセッサアーキテクチャ、ファイルセグメント、セクションなどに関するあらゆる種類の重要な情報が含まれています。これについては後で説明します。ヘッダーには、コンピューターがファイルをELFとして識別するのに役立つ情報も含まれています。最も重要なことは、ELFヘッダーには、実行可能ファイルの場合のプログラムヘッダーテーブルと、実行時にコンピューターが制御を転送する仮想アドレスに関する情報が含まれていることです。





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



それで全部です。このバイナリでchmod + xを実行してから、実行します。178バイトのHelloWorld。これを書いて楽しんでいただけたでしょうか。:-)このHOWTOが役に立った、または面白いと思ったら、私に知らせてください!いつも感謝しています。また、アドバイス、コメント、建設的な批判はいつでも歓迎します。








All Articles