संचार के लिए ICALL गैजेट का दुरुपयोग
सामान्य जानकारी: यह विंडोज कर्नेल में है और यह हमें अपने ड्राइवर में एंटीचीट्स द्वारा पता लगाए बिना संचार करने की अनुमति देगा
तो मैं IDA में स्क्रॉल कर रहा था और मुझे यह मिला
image
आगे की जांच के बाद हम देख सकते हैं कि यह _guard_dispatch_icall_ptr नामक फ़ंक्शन को कॉल करता है। icall मूल रूप से rax पर एक jmp है, इसलिए यदि आप थोड़ा सोचें तो हम इस पूरे फ़ंक्शन को संशोधित कर सकते हैं ताकि यह शेलकोड का उपयोग करके हमारे हैंडलर को कॉल करे।
हमारा शेलकोड
हम ऐसा शेलकोड बनाने जा रहे हैं जो rax को हमारे हैंडलर फ़ंक्शन के पॉइंटर पर सेट करता है। इस तरह जब फ़ंक्शन को कॉल किया जाएगा तो यह हमारे शेलकोड को निष्पादित करेगा और हमारे हैंडलर को कॉल करेगा। हम यह सुनिश्चित करना चाहते हैं कि जब हम अपना शेलकोड बनाएं तो यह उस कोड के बाइट्स के समान आकार का हो जिसे हम संशोधित कर रहे हैं। तो यहाँ मेरे द्वारा asm में उपयोग किए गए शेलकोड का एक उदाहरण है, आपको इसे बाइट्स में बदलना होगा।
sub rsp,0x38
movabs rax,0xdeadbeef #placeholder for handler
movabs r10,0xab39cfee
inc rax
dec rax
call QWORD PTR [rip+0x720d4] # 0x720f8
jmp 0x29
हमारा कोड
cpp में हमें बस फ़ंक्शन का पता प्राप्त करना है और फिर अपने शेलकोड को उसमें मैप करना है, लेकिन यहीं यह मुश्किल हो जाता है, अगर हम इसे सीधे वैसे ही करें जैसा यह है तो हम स्टैक को भ्रष्ट कर देंगे और समय-समय पर ब्लूस्क्रीन हो जाएगा। इससे बचने के लिए हमें स्टैक की मरम्मत करनी होगी। इसलिए अपने हैंडलर के अंदर वापस लौटने के बजाय हमें वही ऑपरेशन करने चाहिए जो फ़ंक्शन कर रहा होता अगर हमने इसे संशोधित न किया होता। मैं इसे पाठक पर छोड़ता हूं क्योंकि मैं एंटीचीट्स से बचने का एक शानदार तरीका सीधे नहीं बताना चाहता, लेकिन याद रखें कि फ़ंक्शन के मूल asm को देखें और देखें कि हम क्या संशोधित कर रहे हैं। साइड नोट: यदि आप स्टैक भ्रष्टाचार को ठीक करते हैं और अपने हैंडलर के अंदर वही करते हैं जो फ़ंक्शन का इरादा था, तो ऐसा दिखेगा जैसे कुछ भी संशोधित नहीं हुआ है! :)
//getting address to function
FunctionAddress = module + 0xD70C;
BYTE shellcode[] = { 0x48, 0x83, 0xEC, 0x38, 0x48, 0xB8, 0xEF, 0xBE, 0xAD, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x49, 0xBA, 0xEE, 0xCF, 0x39, 0xAB, 0x00, 0x00, 0x00, 0x00, 0x48, 0xFF, 0xC0, 0x48, 0xFF, 0xC8, 0xFF, 0x15, 0xD4, 0x20, 0x07, 0x00, 0xE9, 0x00, 0x00, 0x00, 0x00 };
memcpy(&shellcode[6], &hkfunction, 8);
DisableWriteProtection();
memcpy((PVOID)FunctionAddress, &shellcode, sizeof(shellcode));
EnableWriteProtection();
समापन
उम्मीद है कि आपने इस त्वरित राइट-अप से कुछ सीखा होगा, बस इतना जान लें कि आप अन्य गैजेट्स भी पा सकते हैं जो बहुत कुछ करेंगे, जितना जटिल उतना बेहतर।