सी

2008-11-13 8 views
7

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

सवाल यह है:

int i,n; 

void confused() 
{ 
    printf("who called me"); 
    exit(0); 
} 

void shell_call(char *c) 
{ 
    printf(" ***Now calling \"%s\" shell command *** \n",c); 
    system(c); 
    exit(0); 
} 

void victim_func() 
{ 
    int a[4]; 
    printf("[8]:%x\n", &a[8]); 
    printf("Enter n: "); scanf("%d",&n); 
    printf("Enter %d HEX Values \n",n); 
    for(i=0;i<n;i++) scanf("%x",&a[i]); 
    printf("Done reading junk numbers\n"); 
} 

int main() 
{ 
    printf("ls=736c --- ps = 7370 --- cal = 6c6163\n"); 
    printf("location of confused %x \n", confused); 
    printf("location of shell_call %x \n", shell_call); 
    victim_func(); 
    printf("Done, thank you\n"); 

} 

ठीक है, तो मैं पहला सवाल सही ढंग से, मनमाने ढंग से दो कार्यों को स्पष्ट रूप से मुख्य पथ में नहीं बुलाया में से एक कॉल करने के लिए है जो पाने में कामयाब रहे। वैसे, यह बिना किसी संशोधन के प्रोग्राम चलाने के दौरान किया जाना है। मैंने प्रोग्राम चलाकर यह किया, N को 7 पर सेट किया, जो मुझे victim_func फ्रेम के फ़ंक्शन पॉइंटर पर ले जाता है, मैं a[7] को भ्रमित या shell_call के स्मृति पते के साथ लिखता हूं, और यह काम करता है। (मेरे पास 64 बिट मशीन है, इसलिए मुझे इसे 7 तक प्राप्त करना है, क्योंकि ईबीआई पॉइंटर 2 इंच चौड़ा है, 1)

मेरा प्रश्न निम्न है, मैं कैसे नियंत्रित कर सकता हूं कि कौन सा तर्क पारित हो जाता है shell_code funcion? अर्थात। मैं stringchar* c पर कैसे लिखूं। संपूर्ण बिंदु केवल प्रोग्राम चलाने के द्वारा ps आदि जैसे यूनिक्स कमांड निष्पादित कर रहा है।

मैं ps की हेक्स प्रतिनिधित्व के साथ EBI सूचक लिखने और है कि करने के लिए shell_call की आर्ग सूची की स्थापना लगा, लेकिन वह काम नहीं किया। मैंने argsv तर्कों को इनपुट करने और shell_call की मुख्य सूची arg_list पर इनपुट करने की भी कोशिश की, लेकिन यह भी काम नहीं किया।

मुझे लगता है कि दूसरा संस्करण काम करना चाहिए, लेकिन मेरा मानना ​​है कि मैं नए स्टैक फ्रेम की सही सूची सेट नहीं कर रहा हूं (मैंने इसे a[8]0 पर लिखा है, क्योंकि यह फ़ंक्शन पॉइंटर का पहला भाग है, और a[9]=736c और a[10]=0000, लेकिन लेखन इसकी शायद नहीं सही के बाद से उन victim_func के मापदंडों हैं तो मैं कैसे shell_call

+7

ध्यान दें कि यह _buffer_ ओवरफ़्लो है, _stack_ ओवरफ़्लो नहीं। –

+1

@ ग्रेग रोजर्स वास्तव में हां, यह एक ढेर अतिप्रवाह है। वास्तव में इस आवेदन में ढेर का उपयोग नहीं किया जाता है। – rook

+0

@Rook: बफर स्टैक पर है। लेकिन बफर ओवरफ्लो भेद्यता है। एक स्टैक ओवरफ़्लो शोषण योग्य नहीं है - अन्यथा पृथ्वी पर हर एक्सएमएल पार्सर कमजोर होगा;) –

उत्तर

8

मैं शायद आप के लिए अपना होमवर्क नहीं करना चाहिए लेकिन मूल रूप से के मापदंडों का उपयोग करते हैं:।?।

आपको स्ट्रिंग को स्टोर करने के लिए स्मृति में कहीं भी एक चरित्र बफर प्राप्त करने की आवश्यकता है निष्पादित करने के लिए एनटी। जाहिर है, आप इसे वैसे ही कर सकते हैं जैसे आप अन्य कार्यों को बुला रहे हैं (यानी आप पाठ को स्टैक पर भी डालते हैं)। आपके लिखे जाने के बाद, आपको उस स्थान पर स्टैक पर एक पॉइंटर लिखना होगा जिसे shell_code फ़ंक्शन को इसके तर्क मिलते हैं।

मेरे बिना काम करने के लिए यह जानने का सबसे अच्छा तरीका आपके लिए काम के सभी पेपर/व्हाइटबोर्ड के टुकड़े पर अपनी स्टैक/मेमोरी सामग्री लिखना है। अगर आप प्रोग्राम के अंदर से सामान्य रूप से shell_code कहा जाता है तो इसे देखें। फिर लिखें कि स्टैक कैसा दिखता है जो victum_func के अंदर दिखता है और यह पता लगाने के लिए कि कौन सी चीज़ों को बदलने के लिए इसे बदलना है, यह "स्वाभाविक रूप से" दिखाई देगा (निश्चित रूप से कुछ चीजों को ध्यान में रखते हुए "वापसी की तरह" परवाह नहीं है)।

यह वह दान है जो आप आज मुझसे प्राप्त कर रहे हैं! :-P

1

आप फोन करने वाले (main()) के ढेर फ्रेम में हेरफेर, और इस तरह से यह व्यवस्था overflowed victim_func() बाद के परिशिष्ट भाग से shell_call() की ओर लौटने एक बसे ढेर के रूप में यह था मिल सकता है कि करने की जरूरत है मुख्य द्वारा बुलाया गया है।

ऐसा करने में आपको शायद पीड़ित के स्टैकफ्रेम में फ्रेम-पॉइंटर को उलझाना होगा, जिसे leave के माध्यम से% ebp में बहाल किया जाएगा।

+2

वाह मैंने बफर ओवरफ्लो का शोषण किया है और मुझे नहीं पता कि आपने अभी क्या कहा है। – rook

+0

@Rook ऐसा लगता है जैसे @ निकोल ने उन फैंसी मार्कोव चेन टेक्स्ट जनरेटर चीज़ों में से एक का उपयोग किया। : पी –