मैं अलेफ एक द्वारा "स्मैश द स्टैक फॉर फन एंड प्रॉफिट" पढ़ रहा हूं, और इस मौके पर पहुंचा हूं:
overflow1.c
------------------------------------------------------------------------------
char shellcode[] =
"xebx1fx5ex89x76x08x31xc0x88x46x07x89x46x0cxb0x0b"
"x89xf3x8dx4ex08x8dx56x0cxcdx80x31xdbx89xd8x40xcd"
"x80xe8xdcxffxffxff/bin/sh";
char large_string[128];
void main() {
char buffer[96];
int i;
long *long_ptr = (long *) large_string;
for (i = 0; i < 32; i++)
*(long_ptr + i) = (int) buffer;
for (i = 0; i < strlen(shellcode); i++)
large_string[i] = shellcode[i];
strcpy(buffer,large_string);
}
अब, मैं शोषण के पीछे के सभी सिद्धांत को समझता हूं: shellcode[]
डेटा सेगमेंट में है (जो कि लेखन योग्य है), और इसमें शेल को स्पॉन करने के लिए कोड होता है।
हम इसकी सामग्री को मुख्य के रूप में कॉपी करना चाहेंगेबफर, बफर की शुरुआत के लिए मुख्य रिटर्न विवरण को अधिलेखित करने के अलावा (ताकि निष्पादन नियंत्रण हमारे "खोल खोल कोड" का होगा। हम इसका मुकाबला करते हुए करते हैं। shellcode
को large_string[]
बफर (दूसरे के लिए लूप), और बाकी (???) का large_sting[]
बफर का पता (पहले-पाश के लिए) होगा।
बेशक, मुख्य "रिटर्न एड्रेस" इस बफर के पते से ओवरराइट हो जाएगा, क्योंकि हम कॉपी करते हैं large_string[]
सेवा मेरे buffer[]
(strcpy
)।
मेरी समस्या शोषण के छोटे विवरण के साथ है:
1.)
पहला-लूप क्यों है i=0
सेवा मेरे i=31
? मेरा मतलब है, सूचक अंकगणितीय को देखते हुए, यह कैसे काम करता है? [large_string[]
केवल 128 बाइट्स है]
2.)
क्या है srlen(shellcode)
?
मैं उस तरह के सामान पर कुछ साफ कर दूंगा।
धन्यवाद!
उत्तर:
उत्तर № 1 के लिए 11) पहला लूप i = 0 से i = 31 तक क्यों है? मेरा मतलब है, सूचक अंकगणितीय को देखते हुए, यह कैसे काम करता है? [big_string [] केवल 128 बाइट्स हैं]
यह एक बार में चार बाइट्स कॉपी करता है (यह जानने पर निर्भर करता है sizeof(int)
है 4
लक्ष्य मंच पर), और 32 * 4 == 128
.
2) srlen (शेलकोड) क्या है?
यह बाइट्स की संख्या में है shellcode
(यह इस तथ्य पर निर्भर करता है कि shellcode
एम्बेडेड नहीं है