Abend,
ich bin seit mehreren Tagen dabei mir ein Exploit (Grund: Studium) zu schreiben, was ich auch präsentieren soll. Ich komme gerade nicht weiter und brauche etwas kompetenten Rat.
Zu meinem Thema soll ich die NOP Slide anhand eines Beispiels erklären. Bevor ich mich nun an NOP's heranwage, möchte ich erstmal ein einfaches Exploit schreiben.
Unter Windoof habe ich echt Probleme gehabt zu debuggen. Aber das ist ein anderes Thema.
Frage #1
In meinem Programm erwarte ich 12 characters (12 Byte) und der EBP ist 4 Byte groß.
Also überschreibe ich die return-Adresse mit meinen sinnlosen charactern und an der 16. Stelle kommt meine Zieladresse.
An dieser Zieladresse kann ich anscheinend nur im derzeitigen Stack Frage Adressen angeben. Egal welche Adresse ich in Linux GDB/GNU eingebe, er landet immer wieder bei der Funktion gets().
Kann ich also nur im derzeitigen Stack Frage Zieladressen eingeben?
-Falls ja, was bringt es dem Angreifer dann? Er kann ja dann nur im Stack Frame des Programms rumspringen.
Ich bin mir sicher man kann auch statt die retq Adresse zu ändern auch gleich ein Assembler Shellcode eingeben, der dann z.B. eine Shell öffnet und ein User erstellt.
Ich weiß leider nur nicht, wie ich das machen soll. Wie muss ich mir so ein Angriff vorstellen?
Szenario:
Auf einem Server habe ich ein Programm laufen, welches genau eine Eingabe erwartet (von mir aus mit der Func gets()). Der Angreifer bzw. "User" gibt in dieses Programm
12 characters 'a' ein + 4 characters 'a' für das überschreiben der EBP + "Shellcode"
Ist dieses Szenario nun richtig dargestellt?
Seid ehrlich und geht kritisch mit meinem Wissen um, ich bedanke mich vorab an alle.
Edit://
Das Programm führt function done() aus. Anschließend erwartet es eine Eingabe. Vor meiner Quellcode-Änderung habe ich zuerst eine EIngabe erwartet. Mit der EIngabe wollte ich auf die function done() adressieren. Das hat nicht geklappt. Also habe ich die Schlussfolgerung gezogen, das ich nur Adressen im stack frage adressieren kann. So beschloss ich auch zuerst die function done() aufzurufen - damit sie im stack frame landet - um dann erneut auf sie zurückzuweisen.