c सी में स्टैक अतिप्रवाह शोषण




stack-overflow buffer-overflow (3)

आपको कॉलर ( main() ) के स्टैक फ्रेम को हेरफेर करने की ज़रूरत है, और इसे इस तरह से व्यवस्थित करें कि shell_call() को अतिप्रवाह victim_func() के victim_func() बाद में एक स्थिर स्टैक मिल सकता है जैसा कि यह था मुख्य द्वारा बुलाया

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

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

प्रश्न निम्न है:

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 के स्मृति पते के साथ shell_call , और यह काम करता है। (मेरे पास एक 64 बिट मशीन है, इसलिए मुझे इसे 7 तक लेना है, क्योंकि ईबीआई पॉइंटर 2 इंच की चौड़ाई है, 1 के बजाय)

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

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

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


मुझे संभवतः आपके लिए आपका होमवर्क नहीं करना चाहिए लेकिन मूल रूप से:

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

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

यह सब दान है जो आज से मुझे मिल रहा है! :-P


साबपबॉक्स ने आपको सही दिशा में आगे बढ़ने के लिए पहले से ही बहुत अच्छा काम किया है।

अधिक जानकारी के लिए; http://www.skullsecurity.org/wiki/index.php/Example_4