2012-11-16 15 views
5

मेरे पास शोषण के लिए एक छोटा सी प्रोग्राम है। और हम किए जाने वाले हमले के पीछे तर्क भी समझा। हालांकि, जितना मैं कोशिश करता हूं, यह सिर्फ मेरे लिए काम नहीं कर रहा है।प्रारूप स्ट्रिंग अटैक

#include <stdio.h> 
#include <stdlib.h> 

#define SECRET1 0x44 
#define SECRET2 0x55 

int main(int argc, char *argv[]) { 
    char user_input[100]; 
    int *secret; 
    int int_input; 
    int a, b, c, d; /* other variables, not used here.*/ 

    /* The secret value is stored on the heap */ 
    secret = (int *) malloc(2*sizeof(int)); 

    /* getting the secret */ 
    secret[0] = SECRET1; secret[1] = SECRET2; 

    printf("Please enter a decimal integer\n"); 
    scanf("%d", &int_input); /* getting an input from user */ 
    printf("Please enter a string\n"); 
    scanf("%s", user_input); /* getting a string from user */ 

    printf(user_input); 
    printf("\n"); 

    /* Verify whether your attack is successful */ 
    printf("The original secrets: 0x%x -- 0x%x\n", SECRET1, SECRET2); 
    printf("The new secrets:  0x%x -- 0x%x\n", secret[0], secret[1]); 
    return 0; 
} 

मुझे प्रारूप स्ट्रिंग "printf (user_input) का उपयोग करके गुप्त [0] के पते और मूल्य को मुद्रित करने की आवश्यकता है;"

मैंने कुछ \ "\ x6e \ xaf \ xff \ xff% x% x% x% x% s" देने की कोशिश की है। लेकिन यह काम नहीं कर रहा है। कोई भी सुझाव प्रशंसनीय होगा। बहुत बहुत धन्यवाद।

+1

यदि आप किसी चीज़ का पता मुद्रित करना चाहते हैं, तो आपको शायद ऑपरेटर के पते का उपयोग करना चाहिए, '& '। अच्छी तरह से स्वरूपित कोड के लिए –

+0

+1। –

उत्तर

8

यह कक्षा के लिए एक अभ्यास की तरह दिखता है, इसलिए मैं कुछ पॉइंटर्स प्रदान करूंगा, लेकिन कोई वास्तविक समाधान नहीं।

आप अविश्वसनीय इनपुट प्रदान करके इस कार्यक्रम का फायदा उठाने का प्रयास कर रहे हैं। यहाँ दो काफी स्पष्ट बग हैं; scanf()%s का उपयोग कर scanf() है, क्योंकि आप बफर को ओवरफ़्लो कर सकते हैं और स्टैक को ओवरराइट कर सकते हैं। दूसरा प्रारूप-स्ट्रिंग भेद्यता है। स्टैक को ओवरराइट करने से शायद फ़ंक्शन वापस आने तक आपको कुछ भी दिलचस्प नहीं होने देगा। "सत्यापित करें कि आपका हमला सफल है या नहीं" अनुभाग के आधार पर, आप शायद पहले से कमजोरता का फायदा उठाना चाहते हैं, इसलिए मुझे लगता है कि यह एक प्रारूप स्ट्रिंग भेद्यता माना जाता है।

सत्यापन अनुभाग के आधार पर, आपको secret द्वारा दी गई मेमोरी को ओवरराइट करने की उम्मीद है। स्मृति में नियंत्रित स्थान पर लिखने के लिए printf को उत्पन्न करने का एकमात्र तरीका %n स्वरूप विनिर्देशक का उपयोग करना है, जो दिए गए सूचक को लिखता है।

अब चाल यह पता लगाने के लिए है कि जब तक हम उचित सूचक नहीं पाते हैं तब तक ढेर तक कैसे चलना है। सुविधाजनक रूप से, स्टैक पर पॉइंटर से ठीक पहले उपयोगकर्ता द्वारा नियंत्रित पूर्णांक होता है। इसलिए, हम एक आसान स्पॉट पैटर्न (शायद 65535, जो हेक्स में ffff है) के साथ एक संख्या दर्ज करें, और स्टैक पर क्या है यह देखने के लिए %x एस के साथ प्रारूप स्ट्रिंग का उपयोग करें। एक बार जब हम पाते हैं, तो ढेर पर अगली चीज़ पॉइंटर होना चाहिए।

हम्म। मैंने बस यह कोशिश की, और यह पता चला कि यह काफी आसान नहीं है। स्टैक फ्रेम का सटीक लेआउट वास्तव में घोषणाओं के क्रम से संबंधित नहीं है; और यह मेरे लिए अलग-अलग प्रणालियों के बीच अलग है। इसके बजाए, मुझे शुरुआत में एक प्रसिद्ध स्ट्रिंग के साथ %lx एस का उपयोग करना पड़ा, और वास्तविक सूचक मुद्रित करने के लिए एक पंक्ति जोड़ें, इसलिए मुझे पता चल जाएगा कि मुझे यह कब मिला। फिर उस पॉइंटर के माध्यम से %n के साथ संबंधित %lx को प्रतिस्थापित करें। 20 या तो %lx एस का प्रयास करना सबसे आसान हो सकता है, और जब तक आप उस पॉइंटर को ओवरराइट करने में कामयाब नहीं होते हैं, तब तक प्रत्येक को %n के साथ प्रतिस्थापित करें।

किसी भी तरह, उम्मीद है कि आपको शुरू करने के लिए पर्याप्त है। अगर आपका कोई प्रश्न हैं, तो मुझे से पूछें।

+2

वास्तव में, x86_64 पर पर्याप्त रजिस्ट्रार हैं कि यदि आप O2 या O3 के साथ संकलित करते हैं तो बफर को छोड़कर स्टैक पर कुछ भी नहीं हो सकता है। –

+0

इसके अलावा, अप्रयुक्त चर को संकलक द्वारा अनुकूलित किया जा सकता है, इसलिए स्टैक का वास्तविक सेटअप संभवतः आप उम्मीद नहीं कर सकते हैं। –

+0

आपके इनपुट के लिए बहुत बहुत धन्यवाद। मुझे बार-बार पते मिलते हैं जब मैं% 1x कई बार देता हूं जो मुझे भ्रमित कर रहा है। मैं समझता हूं कि स्टैक (उच्च से निम्न) चर पर ऑर्डर, user_input, गुप्त, int_input में संग्रहीत किया जाता है। इसलिए यदि मैं% 1x 8 बार देता हूं, तो मुझे इंगित करने में सक्षम होना चाहिए और int_input।गुप्त = 0xbffffa5c, user_input = bffffa60, int_input = bffffa58 एक दशमलव पूर्णांक एक स्ट्रिंग दर्ज करें दर्ज करें % 1x% 1x% 1x% 1x% 1x% 1x% 1x% 1x bffffa60bffffa60bffffa584002c8a440021000400212d810 मूल रहस्य: 0x44 - - 0x55 नए रहस्य: 0x44 - 0x55 – shambolic

संबंधित मुद्दे