Encabezado / pie de página grande de bytes de shellcode cuando se pasa de x86 asm a exe?

1

Codifiqué un shell bash simple en x86 y lo compilé a través de nasm y ld en un exe. Cuando hago esto, puedo ver los 31 bytes de instrucciones que realmente hice, pero hay cientos de bytes antes y después de mi código que se agregan al ejecutable. Parece que se añaden un encabezado ELF y un pie de página grande. ¿Para qué se usan? Además, ¿hay una manera de compilar sin que estos bytes terminen en el exe final? En última instancia, este código de shell está destinado a la ejecución de código arbitrario de un 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

Pero después de compilar esto es lo que finalmente tiene el exe. Puedes ver mi ensamblaje desde los bytes 96 a 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                      ........
    
pregunta Nitro 10.03.2017 - 16:15
fuente

1 respuesta

0
  

Codifiqué un shell bash simple en x86 y lo compilé a través de nasm y ld en un exe

Este programa no fue compilado. Más bien, fue ensamblado por NASM, que generó un código de objeto basado en el código fuente del ensamblaje, y luego se vinculó mediante ld .

Secciones

Cuando el texto de origen del ensamblaje se transforma en código objeto por el ensamblador, el ensamblador también crea un archivo objeto que contiene el código objeto. Este archivo de objeto se ajusta al ABI de System V y tiene secciones que utiliza el vinculador para crear el binario ELF ejecutable final del archivo de objeto.

En este caso, parece que NASM creó un archivo de objeto con un encabezado ELF y las siguientes secciones ( readelf -SW <binary> imprime información de la sección sobre el binario):

  • la sección .text , que contiene las instrucciones ejecutables
  • la sección .symbtab , que contiene una tabla de símbolos
  • la sección .shstrtab , que contiene los nombres de las secciones
  • la sección .strtab , que contiene cadenas tales nombres asociados con las entradas de la tabla de símbolos

ld luego usó la información en estas secciones para crear el binario ELF ejecutable.

Eliminación de la sección del archivo ejecutable

Una vez que se haya creado el binario ELF final ejecutable, la información de la sección y los símbolos ya no son necesarios (a menos que el programa utilice funciones en bibliotecas vinculadas dinámicamente). Solo se requieren segmentos para que el programa se cargue en la memoria y sea ejecutado por el cargador de programas en el kernel. Por lo tanto, las secciones .symbtab , .strtab y .shstrtab se pueden eliminar del binario ELF ejecutable mediante la utilidad strip y la opción -R <section name> .

La información de la sección por lo general se elimina del malware ELF, ya que evita que el ejecutable sea desensamblado por objdump o analizado por gdb , ya que estas utilidades se basan en la información de la tabla de encabezado de sección.

    
respondido por el SYS_V 10.03.2017 - 17:09
fuente

Lea otras preguntas en las etiquetas