単純な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 ........
単純な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マルウェアから削除されます。