Stack Overflow
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Bir stack overflow, bir programın yığın (stack) için ayrılan alandan daha fazla veri yazması durumunda 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, kaydedilmiş talimat işaretçisi (EIP/RIP) ve önceki fonksiyona dönmek için kaydedilmiş temel işaretçi (EBP/RBP)'nin yığın üzerinde saklanmasıdır. Bu nedenle, bir saldırgan bunları üzerine yazabilir ve programın yürütme akışını kontrol edebilir.
Güvenlik açığı genellikle bir fonksiyonun yığın içinde ayrılan miktardan daha fazla bayt kopyalaması nedeniyle ortaya çıkar, 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, belirtilen uzunluk ayrılan uzunluktan büyükse, fgets
, read
& memcpy
gibi uzunluk argümanı alan fonksiyonlar da savunmasız bir şekilde kullanılabilir.
Örneğin, aşağıdaki fonksiyonlar savunmasız olabilir:
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 geçersiz kılmak için gereken ofseti bulmanız gerekecek, bunun için genellikle bir De Bruijn dizisi kullanılır. Verilen bir k boyutundaki alfabesi ve n uzunluğundaki alt dizileri için, bu, her olası 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 geçersiz kılan baytların ofsetini bulmak mümkündür.
Bunun için pwntools kullanmak mümkündür:
veya GEF:
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 bu işaretçide belirttiği yere yönlendirilecektir.
Ancak, diğer senaryolarda sadece yığındaki bazı değişken değerlerini üst üste yazmak istismar için yeterli olabilir (kolay CTF zorluklarında olduğu gibi).
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ılacaktır) böylece savunmasız fonksiyon döndüğünde, gizli fonksiyon çağrılacaktır:
Ret2winBu 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:
Stack ShellcodeBu teknik, önceki tekniğin ana korumasını aşmak için temel bir ç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 ProgramingBir taşma her zaman yığında olmayacak, örneğin yığın içinde de olabilir:
Heap OverflowZafiyetlerin istismarını önlemeye çalışan çeşitli korumalar vardır, bunları kontrol edin:
Common Binary Exploitation Protections & BypassesAWS 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)