Einfache buffer-overflow-und shellcode Beispiel
Ich versuche schon zu laufen Aleph One ' s Beispiel, um ein BOF und eine shell öffnen.
Dies ist Aleph One Papier: http://insecure.org/stf/smashstack.html
- Und dies ist aus dem einfachen C-code (befindet sich fast auf der Hälfte des Papiers):
char shellcode[] =
"\xeb\x2a\x5e\x89\x76\x08\xc6\x46\x07\x00\xc7\x46\x0c\x00\x00\x00"
"\x00\xb8\x0b\x00\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80"
"\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xd1\xff\xff"
"\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec\x5d\xc3";
void main() {
int *ret;
ret = (int *)&ret + 2;
(*ret) = (int)shellcode;
}
Nun, ich habe versucht, läuft dieses Programm in einer SSH-bash, aber ohne Erfolg.
Da nichts passiert ist, nachdem es läuft, habe ich gedacht, dass ich einfach nicht schreiben, die Rückkehr-Adresse, so habe ich den GDB zu sehen, der Abstand zwischen der ret-variable und die echte Rückkehr-Adresse, und erkannte, es war 7.
Um zu überprüfen, mich selbst, versuchte ich es mit größerer ret in 3,4,5,6, und in der Tat, nur wenn ich die geänderte Zeile 10:
ret = (int *)&ret + 7;
Bekam ich einen "segmentation fault".
Doch, ich verstehe nicht, warum die bash ist nicht geöffnet und ich bekomme diese Fehlermeldung, statt.
P. S ich auf 'Logik smashthestack' SSH-Server (die eine Ihrer Herausforderungen ist BOF): http://logic.smashthestack.org:88/
Dank für die Helfer.
- OS? Version? (oh, und
main()
zurückint
...) - Linux 2.6.18-92.1.18.el5xen x86_64
- verwenden Sie 64-bit aber die Zuordnung shellcode-Adresse mit casting int(4 bytes) und mit int*
- danke, das problem gelöst
- Sie sind herzlich willkommen. beachten Sie auch, dass der Autor erzeugt, shellcode mit 32bit asm. so sollten Sie umschreiben Autors shelcode.asm selbst und dann bekommen die hex-Befehle strings. Da ich aber weiß, das shellcode sein könnte, funktioniert nicht Ursache der linux-Ausführung Berechtigungen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vom http://blog.markloiseau.com/2012/06/64-bit-linux-shellcode/:
.
Beachten Sie auch diese änderungen zu schreiben shellcode:
Das problem ist in der shellcode. Der shellcode ist ein const string, so kann man nicht ändern. Wenn Sie einen Blick auf die Demontage der shellcode, dann können Sie sehen, dass der code versucht, die Zeichenfolge zu ändern.
Könnten Sie versuchen, Speicher und reservieren Sie den shellcode dorthin. Vielleicht immer noch nicht arbeiten, je nach OS, wie Sie vielleicht ändern müssen, um die Schutz-Einstellungen erlauben das ausführen von code in den zugewiesenen memorxy block.
Grund für die änderung selbst ist, dass die stirng für die Ausführung der shell erfordert eine 0-byte am Ende, aber dies kann nicht in der Zeichenfolge enthalten ist, so hat der code zu patchen, bevor Sie es ausführen können, die shell. Dies ist der Grund für den SIGSEGV.
Dein problem ist fast identisch zu diesem hier: Assembler-Code halten, zeigt das segment fault
Den shellcode ist im Grunde das gleiche. Nicht genau, aber nach dem gleichen Prinzip.
Update
Zu erklären, diese ein bisschen besser, der exploit funktioniert, wenn die BSS-segment beschreibbar ist. Deklarieren Sie eine Zeichenfolge wie diese lässt es zu, die nach dem C-standard, const. Schreiben auf einen statischen string ist Undefiniertes Verhalten, damit es funktionieren kann oder nicht.