Format Strings
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
If you are interested in hacking career and hack the unhackable - we are hiring! (फ्लूएंट पोलिश लिखित और मौखिक आवश्यक).
C में printf
एक फ़ंक्शन है जिसका उपयोग कुछ स्ट्रिंग को प्रिंट करने के लिए किया जा सकता है। इस फ़ंक्शन की पहली पैरामीटर जो अपेक्षित है वह है फॉर्मेटर्स के साथ कच्चा टेक्स्ट। अन्य पैरामीटर जो अपेक्षित हैं वे हैं कच्चे टेक्स्ट से फॉर्मेटर्स को बदलने के लिए मान।
अन्य संवेदनशील फ़ंक्शन हैं sprintf()
और fprintf()
।
संवेदनशीलता तब प्रकट होती है जब हमलावर टेक्स्ट को इस फ़ंक्शन के पहले तर्क के रूप में उपयोग किया जाता है। हमलावर एक विशेष इनपुट तैयार करने में सक्षम होगा जो printf फॉर्मेट स्ट्रिंग क्षमताओं का दुरुपयोग करके किसी भी पते (पढ़ने योग्य/लिखने योग्य) में कोई भी डेटा पढ़ने और लिखने के लिए। इस तरह से मनमाने कोड को निष्पादित करने में सक्षम होना।
उदाहरण:
कमजोर उदाहरण:
सामान्य उपयोग:
गायब तर्कों के साथ:
fprintf कमजोर:
फॉर्मेट %<n>$x
, जहाँ n
एक संख्या है, printf को यह संकेत करने की अनुमति देता है कि n पैरामीटर (स्टैक से) का चयन करें। इसलिए, यदि आप printf का उपयोग करके स्टैक से 4वां पैरामीटर पढ़ना चाहते हैं, तो आप कर सकते हैं:
और आप पहले से चौथे पैरामीटर तक पढ़ सकते हैं।
या आप कर सकते हैं:
और सीधे चौथे को पढ़ें।
ध्यान दें कि हमलावर printf
पैरामीटर को नियंत्रित करता है, जिसका अर्थ है कि उसका इनपुट printf
के कॉल होने पर स्टैक में होगा, जिसका अर्थ है कि वह स्टैक में विशिष्ट मेमोरी पते लिख सकता है।
एक हमलावर जो इस इनपुट को नियंत्रित करता है, स्टैक में मनमाने पते को जोड़ने और printf
को उन्हें एक्सेस करने में सक्षम होगा। अगले अनुभाग में इस व्यवहार का उपयोग कैसे करें, यह समझाया जाएगा।
फॉर्मेटर %n$s
का उपयोग करना संभव है ताकि printf
n स्थिति में स्थित पते को प्राप्त करे, उसके बाद और इसे एक स्ट्रिंग के रूप में प्रिंट करे (जब तक 0x00 नहीं मिलता)। इसलिए यदि बाइनरी का बेस पता 0x8048000
है, और हम जानते हैं कि उपयोगकर्ता इनपुट स्टैक में चौथी स्थिति से शुरू होता है, तो बाइनरी की शुरुआत को प्रिंट करना संभव है:
ध्यान दें कि आप इनपुट की शुरुआत में 0x8048000 का पता नहीं डाल सकते क्योंकि स्ट्रिंग उस पते के अंत में 0x00 पर कट जाएगी।
अपने इनपुट के लिए ऑफसेट खोजने के लिए, आप 4 या 8 बाइट्स (0x41414141
) भेज सकते हैं, उसके बाद %1$x
और मान बढ़ाएं जब तक कि A's
प्राप्त न हो जाएं।
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)