4.9 KiB
Raw Blame History

Ret2esp / Ret2reg

{{#include ../../../banners/hacktricks-training.md}}

Ret2esp

Επειδή ο ESP (Δείκτης Στοίβας) δείχνει πάντα στην κορυφή της στοίβας, αυτή η τεχνική περιλαμβάνει την αντικατάσταση του EIP (Δείκτης Εντολών) με τη διεύθυνση μιας jmp esp ή call esp εντολής. Κάνοντας αυτό, ο shellcode τοποθετείται ακριβώς μετά την αντικατεστημένη EIP. Όταν εκτελείται η εντολή ret, ο ESP δείχνει στην επόμενη διεύθυνση, ακριβώς εκεί που είναι αποθηκευμένος ο shellcode.

Αν η Τυχαία Διάταξη Χώρου Διευθύνσεων (ASLR) δεν είναι ενεργοποιημένη στα Windows ή Linux, είναι δυνατόν να χρησιμοποιηθούν οι εντολές jmp esp ή call esp που βρίσκονται σε κοινές βιβλιοθήκες. Ωστόσο, με την ASLR ενεργή, μπορεί να χρειαστεί να αναζητήσετε αυτές τις εντολές μέσα στο ευάλωτο πρόγραμμα (και μπορεί να χρειαστεί να νικήσετε PIE).

Επιπλέον, η δυνατότητα τοποθέτησης του shellcode μετά την καταστροφή του EIP, αντί στη μέση της στοίβας, διασφαλίζει ότι οποιεσδήποτε εντολές push ή pop που εκτελούνται κατά τη διάρκεια της λειτουργίας της συνάρτησης δεν θα παρεμβαίνουν στον shellcode. Αυτή η παρέμβαση θα μπορούσε να συμβεί αν ο shellcode τοποθετούνταν στη μέση της στοίβας της συνάρτησης.

Lacking space

If you are lacking space to write after overwriting RIP (maybe just a few bytes), write an initial jmp shellcode like:

sub rsp, 0x30
jmp rsp

Και γράψτε το shellcode νωρίς στη στοίβα.

Παράδειγμα

Μπορείτε να βρείτε ένα παράδειγμα αυτής της τεχνικής στο https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp με μια τελική εκμετάλλευση όπως:

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

Ομοίως, αν γνωρίζουμε ότι μια συνάρτηση επιστρέφει τη διεύθυνση όπου είναι αποθηκευμένο το shellcode, μπορούμε να εκμεταλλευτούμε τις εντολές call eax ή jmp eax (γνωστές ως τεχνική ret2eax), προσφέροντας μια άλλη μέθοδο για να εκτελέσουμε το shellcode μας. Ακριβώς όπως το eax, οποιοδήποτε άλλο καταχωρητή που περιέχει μια ενδιαφέρουσα διεύθυνση θα μπορούσε να χρησιμοποιηθεί (ret2reg).

Παράδειγμα

Μπορείτε να βρείτε ένα παράδειγμα εδώ: https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/ret2reg/using-ret2reg

Προστασίες

  • NX: Αν η στοίβα δεν είναι εκτελέσιμη, αυτό δεν θα βοηθήσει καθώς πρέπει να τοποθετήσουμε το shellcode στη στοίβα και να κάνουμε jump για να το εκτελέσουμε.
  • ASLR & PIE: Αυτά μπορούν να κάνουν πιο δύσκολη την εύρεση μιας εντολής για να κάνουμε jump στο esp ή σε οποιονδήποτε άλλο καταχωρητή.

Αναφορές

{{#include ../../../banners/hacktricks-training.md}}