Ret2win - arm64
Ret2win - arm64
Znajdź wprowadzenie do arm64 w:
Introduction to ARM64v8Kod
Kompiluj bez pie i canary:
Znalezienie offsetu
Opcja wzorca
Ten przykład został stworzony przy użyciu GEF:
Uruchom gdb z gef, stwórz wzorzec i użyj go:
arm64 spróbuje powrócić do adresu w rejestrze x30 (który został skompromitowany), możemy to wykorzystać do znalezienia przesunięcia wzorca:
Przesunięcie wynosi 72 (9x48).
Opcja przesunięcia stosu
Zacznij od uzyskania adresu stosu, w którym przechowywana jest rejestr pc:
Teraz ustaw punkt przerwania po read()
i kontynuuj, aż read()
zostanie wykonane, a następnie ustaw wzór, taki jak 13371337:
Znajdź, gdzie ten wzór jest przechowywany w pamięci:
Następnie: 0xfffffffff148 - 0xfffffffff100 = 0x48 = 72
Brak PIE
Zwykły
Uzyskaj adres funkcji win
:
Eksploit:
Off-by-1
W rzeczywistości będzie to bardziej przypominać off-by-2 w przechowywanym PC w stosie. Zamiast nadpisywać cały adres powrotu, nadpiszemy tylko ostatnie 2 bajty wartością 0x06c4
.
Możesz znaleźć inny przykład off-by-one w ARM64 w https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/, który jest prawdziwym off-by-one w fikcyjnej podatności.
Z PIE
Skompiluj binarny plik bez argumentu -no-pie
Off-by-2
Bez wycieku nie znamy dokładnego adresu funkcji wygrywającej, ale możemy znać offset funkcji od binarnego pliku, a wiedząc, że adres powrotu, który nadpisujemy, już wskazuje na bliski adres, możliwe jest wyciekanie offsetu do funkcji wygrywającej (0x7d4) w tym przypadku i po prostu użycie tego offsetu:
```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()
Last updated