2011-11-20 15 views
5

Estoy tratando de hacer un ataque de desbordamiento de búfer para un código vulnerable dado. Pero parece que va mal porque, aunque mis cadenas de exploits no corrompen la pila, no puedo hacer que mi código de ensamblado (incrustado en la cadena de exploits) funcione.Ninguna función contiene contador de programa para el cuadro seleccionado

Aquí está la pieza de valores de memoria antes de la ejecución de la instrucción 'ret' del programa que quiero atacar.

0x55683984:  0x5568398c 0x...(old r.a)  0x68e322a1  0x0000c31c 
0x55683994:  0xf7fa9400  0x0804a3d7  0x556839c0  0xf7e518d0 

En este punto, las cosas van mal porque no puede sacar la pila y hacer punto EIP% al valor de estallar? Así que mi código de ensamblaje de exploit no funciona. (0x68e322a1 0x0000c31c) Gdb dice que ninguna función contiene el contador de programa para el cuadro seleccionado. y cuando intento ejecutarlo sin depuración, causa un error de segmentación.

¿Tiene este problema algo que ver con la longitud de mi ensamblaje? (en este caso es 6)?

Program received signal SIGSEGV, Segmentation fault. 
0x5568398c in ??() 
(gdb) x 0x5568398c 
0x5568398c: 0x68e322a1 

¿cómo puede suceder esto cuando puedo ver qué hay dentro de la dirección que causa segfault?

+0

Usted puede usar '' disassemble' o/10i $ eip' para ver el código donde segfaulted y 'bt' para ver la x pila de llamadas. Sería más fácil ayudar si mostraras el código que estás tratando de ejecutar (si es el 68 e3 ... parece que tiene un byte cero aislado incrustado). Por cierto, si esto es para la tarea debe marcarlo como tal. – user786653

+0

Utilicé el diseño asm para ver qué está sucediendo y eso no ayudó. Además, ahora que mi código de explotación finalizó con un c3 (que significa instrucción ret), un byte cero aislado no es un problema. El punto clave aquí es que accidentalmente trato de alcanzar una dirección de memoria que probablemente no está definida. – bfaskiplar

Respuesta

3

Ok, aquí está la historia Me olvidé de colocar un '$' delante de la dirección en la instrucción movl en mi código de ensamblaje. Por lo tanto, el programa intentaba acceder a una dirección de memoria no definida que causaba un error de segmentación.

Pero, no me gusta la forma en que el BGF notifica esta situación diciendo simplemente 'Sin función contiene contador de programa para el cuadro seleccionado'

+0

Gracias, hombre, salvaste mi tocino – JustGage

5

Por defecto disassemble imprime el código de la función actual. En su caso, el contador del programa apunta a algún lugar para apilar y gdb no entendería dónde están los límites de la función actual. Es por eso que mensaje de error.

Pero puede especificar manualmente un rango de direcciones de desmontar:

(gdb) disassemble 0x7fffffffbb00,0x7fffffffbbff 
+1

Muy buen truco. Alternativamente, puedes usar disassemble $ rip, $ rip + offset lo que alivia el dolor de averiguar dónde está tu stack frame – Eric

Cuestiones relacionadas