Stack Overflow
Reading time: 5 minutes
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.
What is a Stack Overflow
Bir stack overflow, bir programın yığın (stack) için ayrılan alandan daha fazla veri yazdığında meydana gelen bir güvenlik açığıdır. Bu fazla veri, komşu bellek alanını üzerine yazarak, geçerli verilerin bozulmasına, kontrol akışının kesintiye uğramasına ve potansiyel olarak kötü niyetli kodun çalıştırılmasına yol açar. Bu sorun genellikle, girdi üzerinde sınır kontrolü yapmayan güvensiz fonksiyonların kullanılmasından kaynaklanır.
Bu üzerine yazmanın ana sorunu, kayıtlı talimat işaretçisi (EIP/RIP) ve önceki fonksiyona dönmek için kayıtlı temel işaretçi (EBP/RBP) değerlerinin yığın üzerinde saklanmasıdır. Bu nedenle, bir saldırgan bu değerleri üzerine yazabilir ve programın yürütme akışını kontrol edebilir.
Güvenlik açığı genellikle bir fonksiyonun yığının içine ayrılan miktardan daha fazla bayt kopyalaması nedeniyle ortaya çıkar ve bu da yığının diğer kısımlarını üzerine yazmasına olanak tanır.
Buna karşı duyarlı bazı yaygın fonksiyonlar şunlardır: strcpy
, strcat
, sprintf
, gets
... Ayrıca, fgets
, read
& memcpy
gibi uzunluk argümanı alan fonksiyonlar, belirtilen uzunluk ayrılan miktardan büyükse, savunmasız bir şekilde kullanılabilir.
Örneğin, aşağıdaki fonksiyonlar savunmasız olabilir:
void vulnerable() {
char buffer[128];
printf("Enter some text: ");
gets(buffer); // This is where the vulnerability lies
printf("You entered: %s\n", buffer);
}
Stack Overflow ofsetlerini Bulma
Stack overflow'ları bulmanın en yaygın yolu, çok büyük bir A
girişi vermektir (örneğin, python3 -c 'print("A"*1000)'
) ve 0x41414141
adresinin erişilmeye çalışıldığını belirten bir Segmentation Fault
beklemektir.
Ayrıca, Stack Overflow zafiyetini bulduktan sonra, geri dönüş adresini yazmak için gereken ofseti bulmanız gerekecek; bunun için genellikle bir De Bruijn dizisi kullanılır. Verilen bir k boyutundaki alfabede ve n uzunluğundaki alt diziler için, bu, herhangi bir n uzunluğundaki alt dizinin tam olarak bir kez bitişik bir alt dizi olarak göründüğü döngüsel bir dizidir.
Bu şekilde, EIP'yi kontrol etmek için hangi ofsetin gerektiğini elle bulmak yerine, bu dizilerden birini dolgu olarak kullanmak ve ardından onu yazmayı bitiren baytların ofsetini bulmak mümkündür.
Bunun için pwntools kullanmak mümkündür:
from pwn import *
# Generate a De Bruijn sequence of length 1000 with an alphabet size of 256 (byte values)
pattern = cyclic(1000)
# This is an example value that you'd have found in the EIP/IP register upon crash
eip_value = p32(0x6161616c)
offset = cyclic_find(eip_value) # Finds the offset of the sequence in the De Bruijn pattern
print(f"The offset is: {offset}")
ve GEF:
#Patterns
pattern create 200 #Generate length 200 pattern
pattern search "avaaawaa" #Search for the offset of that substring
pattern search $rsp #Search the offset given the content of $rsp
Yığın Taşmalarını Sömürme
Bir taşma sırasında (taşma boyutunun yeterince büyük olduğunu varsayarsak) yığın içindeki yerel değişkenlerin değerlerini üst üste yazma imkanına sahip olacaksınız, bu da kaydedilmiş EBP/RBP ve EIP/RIP'ye (veya daha fazlasına) ulaşana kadar devam eder.
Bu tür bir zafiyeti istismar etmenin en yaygın yolu, dönüş adresini değiştirmektir, böylece fonksiyon sona erdiğinde kontrol akışı kullanıcının belirttiği yere yönlendirilecektir.
Ancak, diğer senaryolarda sadece yığın içindeki bazı değişkenlerin değerlerini üst üste yazmak istismar için yeterli olabilir (örneğin, kolay CTF zorluklarında).
Ret2win
Bu tür CTF zorluklarında, asla çağrılmayan ve kazanmak için çağırmanız gereken bir fonksiyon binary içinde bulunmaktadır. Bu zorluklar için sadece dönüş adresini üst üste yazmak için ofseti bulmanız ve çağırmak için fonksiyonun adresini bulmanız gerekir (genellikle ASLR devre dışı bırakılmış olacaktır) böylece savunmasız fonksiyon döndüğünde, gizli fonksiyon çağrılacaktır:
Yığın Shellcode
Bu senaryoda, saldırgan yığında bir shellcode yerleştirebilir ve kontrol edilen EIP/RIP'i kullanarak shellcode'a atlayıp rastgele kod çalıştırabilir:
ROP & Ret2... teknikleri
Bu teknik, önceki tekniğin ana korumasını aşmak için temel çerçevedir: Çalıştırılamaz yığın (NX). Ve mevcut talimatları istismar ederek rastgele komutlar çalıştıracak birkaç başka tekniği (ret2lib, ret2syscall...) gerçekleştirmeye olanak tanır:
ROP - Return Oriented Programing
Yığın Taşmaları
Bir taşma her zaman yığında olmayabilir, örneğin yığın içinde de olabilir:
Koruma Türleri
Zafiyetlerin istismarını önlemeye çalışan çeşitli korumalar vardır, bunları kontrol edin:
Common Binary Exploitation Protections & Bypasses
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.