Hola pianista,
-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:
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.
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.
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" ?