hacktricks/binary-exploitation/stack-overflow
2024-06-16 09:03:34 +00:00
..
ret2win Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/aw2 2024-05-05 22:43:52 +00:00
stack-shellcode Translated ['binary-exploitation/heap/README.md', 'binary-exploitation/h 2024-04-10 15:34:53 +00:00
pointer-redirecting.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/aw2 2024-04-07 03:33:05 +00:00
README.md Translated ['binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc 2024-06-16 09:03:34 +00:00
ret2win.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/aw2 2024-04-07 03:33:05 +00:00
stack-pivoting-ebp2ret-ebp-chaining.md Translated ['binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-e 2024-04-19 14:50:19 +00:00
stack-shellcode.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/aw2 2024-04-07 03:33:05 +00:00
uninitialized-variables.md Translated ['binary-exploitation/heap/README.md', 'binary-exploitation/h 2024-04-10 15:34:53 +00:00

Stack Overflow

Sıfırdan kahraman olmaya kadar AWS hackleme öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı) ile!

HackTricks'ı desteklemenin diğer yolları:

Stack Overflow Nedir

Bir stack overflow (yığın taşması), bir programın yığına ayrılan alanın kapasitesinden fazla veri yazdığı bir güvenlik açığıdır. Bu fazla veri, bitişik bellek alanını üzerine yazacak, geçerli verilerin bozulmasına, kontrol akışının bozulmasına ve potansiyel olarak kötü amaçlı kodun yürütülmesine neden olacaktır. Bu sorun genellikle, giriş üzerinde sınırlar kontrolü yapmayan güvensiz işlevlerin kullanılmasından kaynaklanır.

Bu üzerine yazma işleminin ana sorunu, 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 yazabilir ve programın yürütme akışını kontrol edebilir.

Bu zafiyet genellikle bir işlevin yığına ayrılan miktarından daha fazla bayt kopyaladığı için ortaya çıkar, bu nedenle yığının diğer kısımlarını üzerine yazabilir.

Bu zafiyete duyarlı olan bazı yaygın işlevler: strcpy, strcat, sprintf, gets... Ayrıca, bir uzunluk argümanı alan fgets, read & memcpy gibi işlevler, belirtilen uzunluğun ayrılan uzunluktan büyük olduğu durumlarda zafiyetli bir şekilde kullanılabilir.

Örneğin, aşağıdaki işlevler zafiyete açık 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

Yığın taşmalarını bulmanın en yaygın yolu, çok büyük bir A girişi vermek (örneğin python3 -c 'print("A"*1000)') ve erişilmeye çalışılan adresin 0x41414141 olduğunu gösteren bir Segmentation Fault beklemektir.

Ayrıca, Yığın Taşma açığı bulduğunuzda, 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 yazılan baytların ofsetini bulmak mümkündür.

Bunun için genellikle pwntools kullanılabilir:

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}")

veya 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

Taşma sırasında (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.
Bu tür bir zafiyeti istismar etmenin en yaygın yolu, dönüş adresini değiştirmektir, böylece işlev bittiğinde kontrol akışı kullanıcının belirttiği yere yönlendirilir.

Ancak, diğer senaryolarda belki sadece yığında bazı değişken değerlerini üzerine yazmak yeterli olabilir (kolay CTF zorluklarında olduğu gibi).

Ret2win

Bu tür CTF zorluklarında, asla çağrılmayan bir işlev içinde bulunan ve çağrılması gereken bir işlev bulunmaktadır. Bu zorluklarda sadece dönüş adresini üzerine yazmak için ofseti bulmanız ve çağrılacak işlevin adresini bulmanız yeterlidir (genellikle ASLR devre dışı bırakılmış olacaktır), bu sayede zafiyetli işlev döndüğünde gizli işlev çağrılacaktır:

{% content-ref url="ret2win/" %} ret2win {% endcontent-ref %}

Yığın Kabuk Kodu

Bu senaryoda saldırgan, yığında bir kabuk kodu yerleştirebilir ve kontrol edilen EIP/RIP'yi kötü amaçlı kodu çalıştırmak için kabuk kodusuna atlamak için kullanabilir:

{% content-ref url="stack-shellcode/" %} stack-shellcode {% endcontent-ref %}

ROP ve Ret2... teknikleri

Bu teknik, önceki tekniğe başlıca korumayı atlamak için temel çerçevedir: Yürütülebilir yığın yok (NX). Ve ikili dosyadaki mevcut talimatları kötüye kullanarak keyfi komutları çalıştırmayı sağlayan diğer teknikleri gerçekleştirmenize olanak tanır (ret2lib, ret2syscall...):

{% content-ref url="../rop-return-oriented-programing/" %} rop-return-oriented-programing {% endcontent-ref %}

Yığın Taşmaları

Bir taşma her zaman yığında olmayabilir, örneğin yığın içinde de olabilir:

{% content-ref url="../libc-heap/heap-overflow.md" %} heap-overflow.md {% endcontent-ref %}

Koruma Türleri

Zafiyetlerin istismarını önlemeye çalışan çeşitli korumalar bulunmaktadır, bunları kontrol edin:

{% content-ref url="../common-binary-protections-and-bypasses/" %} common-binary-protections-and-bypasses {% endcontent-ref %}