Guten Morgen an euch alle
ich bin gerade durch google auf das Forum hier gestoßen und dachte ich frage euch mal um Hilfe...
Also: Ich muss heute ein Übungsblatt zum Thema Buffer overflows abgeben, bei dem ein C-Programm gegeben ist und ein Exploit, welches einen Buffer Overflow anzettelt- und verschiedene Möglichkeiten, wie man das verhindern kann. Und nun soll ich bewerten, was von den Möglichkeiten am sinnvollsten ist.
Mein Problem ist jetzt, dass ich nicht wirklich Ahnung von C habe (ok, vielleicht auch gar keine Ahnung)
und mir nur schwer zusammenreimen kann, was das alles genau macht
Deswegen komme ich damit nicht klar und dachte ich frage hier um Hilfe.
Hier ist mal der Code des Programms:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| bool check (short i, short n){ return i<n; }
int main (int argc, char *argv[]){ if (argc!= 4 ) return -1; n= atoi(argv[1]); if (n<0) return -1; int a[n]; int i= atoi(argv[2]); int d=atoi(argv[3]); if(check(i,n)) a[i]=d; return 0; } |
Und hier das Exploit:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| int main (void){ char* args[3]; char *env[1]; char sc[sizeof(shellcode)+1]; char a1[20]; char a2[20]; char a3[20]; sprintf(a1, "%d", 32767); sprintf(a2, "%d", 32767+S_LOCAL+2); sprintf(a3, "%d", (int) ARGV0_ADDR); strcpy(sc, shellcode); sc[sizeof(shellcode)]='\0'; env[0]=NULL; return execve("target", args, env); } |
Wobei S_LOCAL die Größe der lokalen Variablen zwischen array a und dem sf ist.
So und folgende Möglichkeiten zur Abwehr sind angegeben, die ich dann bewerten soll:
a) Checking array bounds at runtime with CRED
b) Checking array bounds at run-time with Libsafe or Libsafe PLUS
c) Stack canaries
d) Non-executable stack
e) Adress space randomization
Für mich macht das halt leider alles Sinn - aber es ist sehr unwahrscheinlich dass das stimt
Würde mich über jede Hilfe freuen
Vielen Dank & liebe Grüße,
Jule
Moderiert von Narses: Topic aus Linux API verschoben am Fr 23.11.2012 um 08:25
Moderiert von Gausi: Delphi- durch C#-Tags ersetzt