Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Buffer overflow verhindern


jule.blau - Fr 23.11.12 09:04
Titel: Buffer overflow verhindern
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<0return -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 user profile iconNarses: Topic aus Linux API verschoben am Fr 23.11.2012 um 08:25
Moderiert von user profile iconGausi: Delphi- durch C#-Tags ersetzt


Th69 - Fr 23.11.12 14:02

Hallo jule.blau :welcome:

wie du vllt. schon gemerkt hast, ist dieses Forum eher auf Delphi, C# und Web ausgelegt.
Du hast aber Glück, daß ich in grauer Vorzeit mal C programmiert habe ;-)

Jedoch versteh ich überhaupt nicht den Zusammenhang zwischen deinen beiden Codeausschnitten. Soll "target" der Programmname des ersten Codes sein?
Und ich sehe weder ein "array a" noch eine Variable "sf".


WasWeißDennIch - Fr 23.11.12 14:30

Zumindest das Array lässt sich finden (Zeile 10).

C#-Quelltext
1:
int a[n];                    


Th69 - Fr 23.11.12 15:22

Stimmt,

VLA (Variable length arrays) in C99.

Aber ich denke, bei dem Crosspost im C/C++ Forum http://www.c-plusplus.de/forum/310943 bist du, jule, sowieso besser aufgehoben.


BenBE - Mo 03.12.12 21:58

Da mir das VERDAMMT nach Hausaufgabe aussieht, sag ich dazu jetzt einmal nicht Integer Overflow bzw. Sign Correctness Bug. Das wäre hier nämlich der eigentliche Fehler.

Und Verhindern: Indem man sauberen Code schreibt. Kollegen, die sowas schreiben, töten auch süße Kätzchen.


Serbsis - Mo 10.12.12 12:41

:D Ja na ja scheint auf jeden Fall ne Hausaufgabe zu sein. Ob sie noch mitteilt, welche Note sie dafür bekommen hat?