में स्टैक ओवरफ़्लो एक्सप्लॉयट सी में सवाल वास्तव में स्टैक ओवरफ्लो के बारे में है। मेरे पास एक आश्वासन है कि मैं अपने जीवन के लिए नहीं कर सकता, मैंने जीडीबी में सबकुछ देखा है और मैं इसे समझ नहीं सकता ।सी
सवाल यह है:
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? अर्थात। मैं string
char* c
पर कैसे लिखूं। संपूर्ण बिंदु केवल प्रोग्राम चलाने के द्वारा ps आदि जैसे यूनिक्स कमांड निष्पादित कर रहा है।
मैं ps की हेक्स प्रतिनिधित्व के साथ EBI सूचक लिखने और है कि करने के लिए shell_call
की आर्ग सूची की स्थापना लगा, लेकिन वह काम नहीं किया। मैंने argsv
तर्कों को इनपुट करने और shell_call
की मुख्य सूची arg_list
पर इनपुट करने की भी कोशिश की, लेकिन यह भी काम नहीं किया।
मुझे लगता है कि दूसरा संस्करण काम करना चाहिए, लेकिन मेरा मानना है कि मैं नए स्टैक फ्रेम की सही सूची सेट नहीं कर रहा हूं (मैंने इसे a[8]
0
पर लिखा है, क्योंकि यह फ़ंक्शन पॉइंटर का पहला भाग है, और a[9]=736c
और a[10]=0000
, लेकिन लेखन इसकी शायद नहीं सही के बाद से उन victim_func
के मापदंडों हैं तो मैं कैसे shell_call
ध्यान दें कि यह _buffer_ ओवरफ़्लो है, _stack_ ओवरफ़्लो नहीं। –
@ ग्रेग रोजर्स वास्तव में हां, यह एक ढेर अतिप्रवाह है। वास्तव में इस आवेदन में ढेर का उपयोग नहीं किया जाता है। – rook
@Rook: बफर स्टैक पर है। लेकिन बफर ओवरफ्लो भेद्यता है। एक स्टैक ओवरफ़्लो शोषण योग्य नहीं है - अन्यथा पृथ्वी पर हर एक्सएमएल पार्सर कमजोर होगा;) –