Ho codificato una semplice shell bash in x86 e l'ho compilata via nasm e ld in un exe. Quando faccio questo posso vedere i 31 byte di istruzioni che ho effettivamente fatto, ma ci sono 100 di byte prima e dopo il mio codice che vengono aggiunti all'eseguibile. Sembra che siano stati aggiunti alcuni header ELF e footer di grandi dimensioni. Per cosa sono usati? Inoltre, c'è un modo per compilare senza questi byte che finiscono nell'exe finale? In definitiva, questo codice shell è destinato all'esecuzione arbitraria di codice di una shell 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
Ma dopo averlo compilato è ciò che l'exe alla fine ha. Puoi vedere il mio assembly dai byte 96 al 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 ........