2015-02-17 10 views
6

Ich experimentiere mit Control-Flow-Hijacking-Angriffen auf Programme, die in C unter Linux geschrieben wurden. Ich versuche, einen einfachen ret-2-libc-Angriff auf ein Programm durchzuführen, bei dem die Gegenmaßnahme No-eXecutable-stack aktiviert ist. Zu diesem Zweck kehre ich zu system() Funktion mit Argument /bin/sh zurück.Warum Rückkehr-zu-libc-Shell mit System() sofort beendet?

Aber ich habe ein Problem: Obwohl mein Angriff funktioniert und eine Shell erfolgreich erzeugt wird, wird die Shell sofort nach Eingabe des ersten Zeichens beendet! Das heißt, die Shell schließt sich, nachdem ich irgendeine Taste gedrückt habe!

Dieses Verhalten ist auch zu beobachten in diesem einfachen C-Code:

int main() { system("/bin/sh"); return 0; } 

ich es mit kompilieren: gcc code.c -o system

Warum ist das? Und wie kann ich es reparieren?

Ich experimentiere auf Ubuntu-9.04 mit kernel 2.6.28 und glibc-2.9-1


Update: Die Shell interaktiv wird, wenn und nur wenn der erste Schlüssel, den ich drücken ist ein. Das heißt, wenn das erste Zeichen, das ich gebe, ein new-line (\n) ist, dann bleibt die Shell offen und wird interaktiv.

Also kann jemand erklären, was hier vor sich geht?

+1

Vorausgesetzt, dass Sie das Problem mit standardmäßigen und legitimen C-Code-Shows reproduzieren können, ist dies nicht auf Ihre Exploit-Versuche bezogen, daher ist diese Frage besser für Stack Overflow geeignet. –

+0

@ AndréDaniel Wahr; Dennoch ist dies kein allgemeines Programmierproblem und Experten auf dem Gebiet der Shellcode-Entwicklung können besser helfen. Also habe ich es hier gefragt. –

+2

Ich kann es nicht mit Ihrem Code reproduzieren. Ist das wirklich das Einzige was du da machst? Wie führst du es aus? – StenSoft

Antwort

0

Okay, ich glaube, dass das System /bin/sh erfolgreich aufruft, aber es ruft es mit dem Flag -c.

Versuchen:

/bin/bash -c junk 

, die ähnlich verhalten sollten, was Sie sehen. Sie müssen mit den Registern herumspielen, um den Systemaufruf einzurichten, so dass/bin/sh ohne das Flag -c aufgerufen wird.