Stack Overflow
Stack Overflow Nedir
Bir yığın taşması (stack overflow), bir programın yığına ayrılan kapasiteden daha fazla veri yazdığında meydana gelen bir güvenlik açığıdır. Bu fazla veri, bitişik bellek alanını üzerine yazarak geçerli verilerin bozulmasına, kontrol akışının bozulmasına ve potansiyel olarak kötü amaçlı kodun yürütülmesine neden olabilir. Bu sorun genellikle, giriş üzerinde sınırların kontrol edilmediği güvenli olmayan işlevlerin kullanılmasından kaynaklanır.
Bu üzerine yazma sorununun ana nedeni, kaydedilmiş komut işaretçisi (EIP/RIP) ve kaydedilmiş taban işaretçisi (EBP/RBP)'nin önceki işleve geri dönüş için yığında depolanmasıdır. Bu nedenle, bir saldırgan bunları üzerine yazarak programın yürütme akışını kontrol edebilir.
Bu zafiyet genellikle bir işlevin yığına ayrılan miktarın üzerinde bayt kopyaladığı için ortaya çıkar, bu nedenle yığının diğer kısımlarını üzerine yazabilir.
Bu duruma duyarlı bazı yaygın işlevler: strcpy
, strcat
, sprintf
, gets
... Ayrıca, uzunluk argümanı alan fgets
, read
& memcpy
gibi işlevler, belirtilen uzunluğun ayrılan uzunluktan büyük olduğu durumlarda duyarlı bir şekilde kullanılabilir.
Örneğin, aşağıdaki işlevler duyarlı olabilir:
Stack Taşmaları Ofsetlerini Bulma
Stack taşmalarını bulmanın en yaygın yolu, çok büyük bir A
girdisi vermek (örneğin python3 -c 'print("A"*1000)'
) ve erişilmeye çalışılan adresin 0x41414141
olduğunu gösteren bir Segmentation Fault
almayı beklemektir.
Ayrıca, Stack Overflow zafiyetinin bulunduğunu keşfettikten sonra, dönüş adresini üzerine yazabileceğiniz ofseti bulmanız gerekecektir, bunun için genellikle bir De Bruijn dizisi kullanılır. Bu, k boyutunda bir alfabeye ve n uzunluğundaki alt dizilere sahip bir dizi olup, her olası n uzunluğundaki alt dizinin tam olarak bir kez ardışık bir alt dizi olarak göründüğü döngüsel bir dizidir.
Bu şekilde, EIP'yi kontrol etmek için hangi ofsetin gerektiğini el ile bulmak yerine, bu dizilerden birini dolgu olarak kullanmak ve ardından üzerine yazmayı bitiren baytların ofsetini bulmak mümkündür.
Bunun için genellikle pwntools kullanılabilir:
veya GEF:
Stack Overflow Sömürme
Taşma gerçekleştiğinde (taşma boyutu yeterince büyükse) yığın içindeki yerel değişkenlerin değerlerini üzerine yazabilirsiniz ve kaydedilmiş EBP/RBP ve EIP/RIP'yi (hatta daha fazlasını) bulana kadar devam edebilirsiniz. Bu tür bir zafiyeti istismar etmenin en yaygın yolu, dönüş adresini değiştirerek işlev sona erdiğinde kontrol akışını kullanıcının belirttiği yere yönlendirmektir.
Ancak, diğer senaryolarda belki sadece yığında bazı değişken değerlerini üzerine yazmak istismar için yeterli olabilir (kolay CTF zorluklarında olduğu gibi).
Ret2win
Bu tür CTF zorluklarında, asla çağrılmayan ve kazanmak için çağrmanız gereken bir işlev olan bir işlev binary içinde bulunmaktadır. Bu zorluklar için sadece dönüş adresini üzerine yazmak için ofseti bulmanız ve çağrılacak işlevin adresini bulmanız (genellikle ASLR devre dışı bırakılmış olacaktır) yeterlidir, böylece zafiyetli işlev döndüğünde gizli işlev çağrılacaktır:
pageRet2winYığın Kabuk Kodu
Bu senaryoda saldırgan, bir kabuk kodunu yığına yerleştirebilir ve kontrol edilen EIP/RIP'yi kabuk koduna atlamak ve keyfi kodu yürütmek için kullanabilir:
pageStack ShellcodeROP ve Ret2... teknikleri
Bu teknik, önceki tekniğin ana korumasını atlamak için temel çerçevedir: Yürütülebilir yığın yok (NX). Ve bu, ikili dosyadaki mevcut talimatları kötüye kullanarak keyfi komutları yürütmeyi sağlayan diğer teknikleri gerçekleştirmenizi sağlar (ret2lib, ret2syscall...):
pageROP - Return Oriented ProgramingYığın Taşmaları
Bir taşma her zaman yığında olmayabilir, örneğin yığın içinde de olabilir:
pageHeap OverflowKoruma Türleri
Zafiyetlerin istismarını önlemeye çalışan çeşitli korumalar bulunmaktadır, bunları kontrol edin:
pageCommon Binary Exploitation Protections & BypassesLast updated