Discussion:
Duda en un bufferoverflow simple
(demasiado antiguo para responder)
Ricardo Catalinas Jiménez
2004-07-12 11:39:27 UTC
Permalink
Hola a todos.

El codigo al que me refiero esta pasteado aqui
(http://rafb.net/paste/results/tlGU7e94.html).
El codigo esta compuesto por 2 programas, uno es el vulnerable y el otro
aprovecha el agujero de seguridad del primero.

Me he informado del funcionamiento general de los bufferoverflows (los
del stack) y mirando este codigo tengo una simple duda en una linea en
concreto.

Antes de nada comentar que la variable 'ret' es la que contendra la
direccion en la que empezara nuestro shellcode o nop sled (dependiendo,
pero para el caso da igual). Este valor se escribira a lo largo del
stack hasta sobrescribir la direccion de retorno de la funcion, por lo
que se ejecutara nuestro codigo al salir de dicha funcion.

Hasta aqui todo claro, el funcionamiento general del exploit lo
entiendo. Mi duda se encuantra en la linea 39:

Sabiendo para que sirve la variable 'ret', se supone que averiguamos
dicha direccion en la que empieza el buffer (con nuestro shellcode) con
la funcion 'sp'. Mi duda es que relacion guarda el valor del 'esp' con
dicha direccion en ese momento. A mi entender, el 'esp' esta en ese
momento apuntando a la variable 'ptr' (la cual es local, por lo que se
almacena en el stack, y es la ultima que se ha declado, por lo que
tendra la direccion mas baja dentro del stack).
Por tanto, resumiendo, lo que to entiendo es que con esa funcion
conseguimos la direccion de 'ptr', la cual no es la deseada.

Como el exploit funciona, y se que soy yo el que me equivoco, me
gustaria que alguien me pudiese aclarar que es lo que realmente sucede
en esa linea de codigo.


Gracias por vuestra paciencia.
Saludos
--
Ricardo Catalinas Jimenez th1nk3r(at)server01(dot)org
Madrid, Spain.
Ignatius
2004-07-15 19:58:45 UTC
Permalink
Post by Ricardo Catalinas Jiménez
Hola a todos.
El codigo al que me refiero esta pasteado aqui
(http://rafb.net/paste/results/tlGU7e94.html).
El codigo esta compuesto por 2 programas, uno es el vulnerable y el otro
aprovecha el agujero de seguridad del primero.
Me he informado del funcionamiento general de los bufferoverflows (los
del stack) y mirando este codigo tengo una simple duda en una linea en
concreto.
Antes de nada comentar que la variable 'ret' es la que contendra la
direccion en la que empezara nuestro shellcode o nop sled (dependiendo,
pero para el caso da igual). Este valor se escribira a lo largo del
stack hasta sobrescribir la direccion de retorno de la funcion, por lo
que se ejecutara nuestro codigo al salir de dicha funcion.
Hasta aqui todo claro, el funcionamiento general del exploit lo
Sabiendo para que sirve la variable 'ret', se supone que averiguamos
dicha direccion en la que empieza el buffer (con nuestro shellcode) con
la funcion 'sp'. Mi duda es que relacion guarda el valor del 'esp' con
dicha direccion en ese momento. A mi entender, el 'esp' esta en ese
momento apuntando a la variable 'ptr' (la cual es local, por lo que se
almacena en el stack, y es la ultima que se ha declado, por lo que
tendra la direccion mas baja dentro del stack).
Por tanto, resumiendo, lo que to entiendo es que con esa funcion
conseguimos la direccion de 'ptr', la cual no es la deseada.
Como el exploit funciona, y se que soy yo el que me equivoco, me
gustaria que alguien me pudiese aclarar que es lo que realmente sucede
en esa linea de codigo.
Gracias por vuestra paciencia.
Saludos
Por tanto, resumiendo, lo que to entiendo es que con esa funcion
conseguimos la direccion de 'ptr', la cual no es la deseada.


En realidad va a ser una dirección menor que la de ptr, ya que
se asigna dentro del marco de pila de la función sp().

Lo que yo creo que intenta es aproximar sobre que valores puede andar el
ESP dentro de vuln. Precisamente como es un valor aproximado necesitamos
llenar por delante de NOP para darnos un margen de error de unos cuantos
bytes.

De todas formas hay un error en el programa. Deberias poner un offset
más grande que 0. (Yo he probado con 400 y funciona bien). En caso
contrario salta un Segmentation fault. El problema es que el SP al
leerlo está demasiado cerca de la base de la pila, por lo que al
escribir el buffer se sobrepasa ese límite y salta dicha segmentation
fault (se ha desbordado demasiado la pila).

Espero que te sirva de ayuda.

Un saludo,
Ignatius.

Loading...