Es posible crear una shellcode a partir de un binario programado en C?

Iniciado por Percontex, 8 Abril 2012, 08:25 AM

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

Percontex

A partir de este link:

http://es.wikipedia.org/wiki/Shellcode

Dan como ejemplo este código en C:

#include <stdio.h>

int main() {
  char *scode[2];
  scode[0] = "/bin/sh";
  scode[1] = NULL;
  execve (scode[0], scode, NULL);
}


Luego del debug de únicamente la funcion main se tiene esto:

80483a4:       55                      push   %ebp
80483a5:       89 e5                   mov    %esp,%ebp
80483a7:       83 e4 f0                and    $0xfffffff0,%esp
80483aa:       83 ec 20                sub    $0x20,%esp
80483ad:       c7 44 24 18 a0 84 04    movl   $0x80484a0,0x18(%esp)
80483b4:       08
80483b5:       c7 44 24 1c 00 00 00    movl   $0x0,0x1c(%esp)
80483bc:       00
80483bd:       8b 44 24 18             mov    0x18(%esp),%eax
80483c1:       c7 44 24 08 00 00 00    movl   $0x0,0x8(%esp)
80483c8:       00
80483c9:       8d 54 24 18             lea    0x18(%esp),%edx
80483cd:       89 54 24 04             mov    %edx,0x4(%esp)
80483d1:       89 04 24                mov    %eax,(%esp)
80483d4:       e8 ff fe ff ff          call   80482d8 <execve@plt>
80483d9:       c9                      leave  
80483da:       c3                      ret    
80483db:       90                      nop    


Y por último al "extraer" la shellcode queda así:

\x55\x89\xe5\x83\xe4\xf0\x83\xec\x20\xc7\x44\x24\x18\xa8\xf3\x0a\x08\xc7\x44\x24\x1c\x00\x00\x00\x00\x8b\x44\x24\x18\xc7\x44\x24\x08\x00\x00\x0\x00\x8d\x54\x24\x18\x89\x54\x24\x04\x89\x04\x24\xe8\x1b\xac\x00\x00\xc9\xc3\x90

Y al agregarla a algún script en C para compilar y probarla:

// shellcode.c
// compilar con gcc shellcode.c -o shellcode
void main()
{
((void(*)(void))
{
"\x55\x89\xe5\x83\xe4\xf0\x83\xec\x20\xc7"
"\x44\x24\x18\xa8\xf3\x0a\x08\xc7\x44\x24"
"\x1c\x00\x00\x00\x00\x8b\x44\x24\x18\xc7"
"\x44\x24\x08\x00\x00\x00\x00\x8d\x54\x24"
"\x18\x89\x54\x24\x04\x89\x04\x24\xe8\x1b"
"\xac\x00\x00\xc9\xc3\x90"
}
)();
}


Al momento de hacer ./shellcode arroja una violación de segmento y no se ejecuta sh :(

Al menos en la Wikipedia parece permitir la posibilidad de crear una shellcode desde un binario programado en C, pero leyendo otra documentación me parece que únicamente se logra crear en lenguajes de bajo nivel como asm.

Entonces amigos, es posible crear una shellcode desde un programa binario en C?, o únicamente se pude obtener de archivos asm?

Sagrini

No es posible hacerlo directamente, ya que una shellcode no puede contener bytes nulos (y el binario tiene muchísimos). La idea es escribir en ensamblador una a una todas las líneas que ejecutan la shellcode.

Percontex

Cita de: Sagrini en  8 Abril 2012, 15:22 PM
No es posible hacerlo directamente, ya que una shellcode no puede contener bytes nulos (y el binario tiene muchísimos). La idea es escribir en ensamblador una a una todas las líneas que ejecutan la shellcode.

Eso me temía, bueno tocará comenzar a estudiar a fondo ensamblador :)