
पूरी तरह से गतिशील कॉल स्टैक स्पूफ़र का PoC कार्यान्वयन
पूर्णतः गतिशील कॉल स्टैक स्पूफर का PoC कार्यान्वयन
SilentMoonwalk एक पूर्णतः गतिशील कॉल स्टैक स्पूफर का PoC कार्यान्वयन है, जो मूल कॉलर को कॉल स्टैक से हटाने की तकनीक को लागू करता है, नियंत्रण प्रवाह से अनवाइंडिंग को डीसिंक्रोनाइज़ करने के लिए ROP का उपयोग करता है।
यह PoC स्टैक स्पूफिंग के विषय पर संयुक्त शोध का परिणाम है। शोध के लेखक हैं:
मैं इस बात पर जोर देना चाहता हूँ कि यह कार्य Waldo-IRC और Trickster0 के काम के बिना असंभव होता, जिन्होंने PoC के शुरुआती चरणों और PoC के पीछे के शोध में योगदान दिया।
यह रिपॉजिटरी मनमाने Windows API को कॉल करते समय कॉल स्टैक को स्पूफ करने के लिए एक PoC कार्यान्वयन प्रदर्शित करती है।
यह प्रयास इस Twitter थ्रेड और इस Twitter थ्रेड से प्रेरित था, जहाँ sensei namazso ने स्टैक अनवाइंडिंग दृष्टिकोण को ROP श्रृंखला के साथ विस्तारित करने का सुझाव दिया ताकि अनवाइंडिंग को वास्तविक नियंत्रण प्रवाह से डीसिंक्रोनाइज़ किया जा सके और बाद में मूल स्टैक को पुनर्स्थापित किया जा सके।
यह PoC उपरोक्त के समान कुछ करने का प्रयास करता है, और मूल कॉल स्टैक को पूरी तरह छिपाने के लिए डीसिंक स्टैक का उपयोग करता है, साथ ही EXE इमेज बेस को भी हटा देता है। वापसी पर, मूल स्टैक को पुनर्स्थापित करने के लिए एक ROP गैजेट को आमंत्रित किया जाता है। कोड में, इस प्रक्रिया को लूप में 10 बार दोहराया जाता है, प्रत्येक पुनरावृत्ति में विभिन्न फ्रेम का उपयोग करके, स्थिरता साबित करने के लिए।
उपकरण वर्तमान में 2 मोड का समर्थन करता है, जहाँ एक वास्तव में एक गैर-काम करने वाले पॉप RBP फ्रेम के लिए गलत पैच है, जो वर्तमान RSP को स्थानांतरित करके और कॉल स्टैक में दो नकली फ्रेम जोड़कर संचालित होता है। चूँकि यह सिंथेटिक फ्रेम का उपयोग करके संचालित होता है, मैं इस मोड को "SYNTHETIC" के रूप में संदर्भित करता हूँ।
जब उपकरण उस फ्रेम का चयन करता है जो स्टैक से RBP रजिस्टर को पॉप करके अनवाइंड होता है, तो यह एक अनुपयुक्त फ्रेम का चयन कर सकता है, जिसके परिणामस्वरूप अचानक कटा हुआ कॉल स्टैक बनता है, जैसा कि नीचे देखा जा सकता है।

समस्या का एक मूर्खतापूर्ण समाधान दो नकली फ्रेम बनाना और उन्हें कटे हुए कॉल स्टैक से जोड़ना होगा। इससे एक प्रकार का स्पष्ट रूप से वैध कॉल स्टैक बन जाएगा, भले ही POP RBP कॉल करने वाला कोई उपयुक्त फ्रेम न हो, लेकिन:
_सिंथेटिक स्पूफ का परिणाम नीचे दी गई छवि में देखा जा सकता है:

चित्र 1: Windows 10 - स्पष्ट रूप से वैध, गैर-अनवाइंड करने योग्य कॉल स्टैक जिसमें EXE मॉड्यूल पूरी तरह से हटा दिया गया है (बिना पैरामीटर के फ़ंक्शन getchar को कॉल करना)
नोट: यह ऑपरेशन मोड डिफ़ॉल्ट रूप से अक्षम है। इस मोड को सक्षम करने के लिए, CALLSTACK_TYPE को 1 में बदलें
यह मोड उपरोक्त समस्या का सही समाधान है, जिसमें अनुपयुक्त फ्रेम को केवल एक अन्य उपयुक्त फ्रेम से बदल दिया जाता है।

चित्र 2: Windows 10 - वैध, अनवाइंड करने योग्य कॉल स्टैक जिसमें EXE मॉड्यूल पूरी तरह से हटा दिया गया है (4 पैरामीटर वाले फ़ंक्शन MessageBoxA को कॉल करना)
रिपॉजिटरी में, आप रनटाइम फ़ंक्शन का निरीक्षण करने के लिए एक छोटी उपयोगिता भी पा सकते हैं, जो रनटाइम फ़ंक्शन प्रविष्टियों का विश्लेषण करने में उपयोगी हो सकती है।
UnwindInspector.exe -h
Unwind Inspector v0.100000
अनिवार्य तर्क:
-m <मॉड्यूल>: लक्ष्य DLL
-f <फ़ंक्शन>: लक्ष्य फ़ंक्शन
-a <फ़ंक्शन-पता>: लक्ष्य फ़ंक्शन पता
नमूना आउटपुट:
UnwindInspector.exe -m kernelbase -a 0x7FFAAE12182C
[*] फ़ंक्शन पता 0x7ffaae12182c का उपयोग कर रहा है
रनटाइम फ़ंक्शन (0x000000000000182C, 0x00000000000019ED)
अनवाइंड जानकारी पता: 0x000000000026AA88
संस्करण: 0
Ver + Flags: 00000000
SizeOfProlog: 0x1f
CountOfCodes: 0xc
FrameRegister: 0x0
FrameOffset: 0x0
UnwindCodes:
[00h] Frame: 0x741f - 0x04 - UWOP_SAVE_NONVOL (RDI, 0x001f)
[01h] Frame: 0x0015 - 0x00 - UWOP_PUSH_NONVOL (RAX, 0x0015)
[02h] Frame: 0x641f - 0x04 - UWOP_SAVE_NONVOL (RSI, 0x001f)
[03h] Frame: 0x0014 - 0x00 - UWOP_PUSH_NONVOL (RAX, 0x0014)
[04h] Frame: 0x341f - 0x04 - UWOP_SAVE_NONVOL (RBX, 0x001f)
[05h] Frame: 0x0012 - 0x00 - UWOP_PUSH_NONVOL (RAX, 0x0012)
[06h] Frame: 0xb21f - 0x02 - UWOP_ALLOC_SMALL (R11, 0x001f)
[07h] Frame: 0xf018 - 0x00 - UWOP_PUSH_NONVOL (R15, 0x0018)
[08h] Frame: 0xe016 - 0x00 - UWOP_PUSH_NONVOL (R14, 0x0016)
[09h] Frame: 0xd014 - 0x00 - UWOP_PUSH_NONVOL (R13, 0x0014)
[0ah] Frame: 0xc012 - 0x00 - UWOP_PUSH_NONVOL (R12, 0x0012)
[0bh] Frame: 0x5010 - 0x00 - UWOP_PUSH_NONVOL (RBP, 0x0010)
PoC बनाने और चित्र में दिखाए गए समान व्यवहार देखने के लिए, सुनिश्चित करें:
/GS-)/Od)/GL हटाएं)/Os, /Ot हटाएं)/Oi)इस विषय पर पिछले कार्य का उल्लेख करना उचित है, जिसने इस कार्य की नींव रखी।