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
| import idaapi import idc from z3 import * def simulate_xor(address, xor_value): while True: patch_dword(address, idc.get_wide_dword(address) ^ xor_value) if(idc.get_wide_dword(address)==xor_value): break address+=4 def check(addr): l=int(str(idc.generate_disasm_line(addr,1)).split('+')[1][:-2],16) if ('+' in str(idc.generate_disasm_line(addr,1))and 'h' in str(idc.generate_disasm_line(addr,1))) else int(str(idc.generate_disasm_line(addr,1)).split('+')[1][:-1],16) if ('h' not in str(idc.generate_disasm_line(addr,1))and '+' in str(idc.generate_disasm_line(addr,1)) ) else 0 r=int(str(idc.generate_disasm_line(addr+4,1)).split('+')[1][:-2],16) if ('+' in str(idc.generate_disasm_line(addr+4,1))and 'h' in str(idc.generate_disasm_line(addr+4,1))) else int(str(idc.generate_disasm_line(addr+4,1)).split('+')[1][:-1],16) if ('h' not in str(idc.generate_disasm_line(addr+4,1))and '+' in str(idc.generate_disasm_line(addr+4,1)) ) else 0 e=int(str(idc.generate_disasm_line(addr+8,1)).split(',')[1].split('h')[0],16) return f'flag[{l}]^flag[{r}]=={e}' start=0x404374 nextptr=0x401290 count=0 flag=[BitVec(f'flag[{i}]',8) for i in range(61)] f=Solver() for i,j in enumerate('amateursCTF{'): f.add(flag[i]==ord(j)) f.add(flag[60]==ord('}')) while True: f.add(eval(check(nextptr))) tmp=str(idc.generate_disasm_line(start,1)) print(tmp) instruction = int(tmp[len('mov eax, '):-1],16) tmp=idc.generate_disasm_line(start+24,1) print(tmp) if '+' not in tmp: nextptr=int(tmp[-6:],16) else: tmplist=tmp.split('+') if 'h' in tmplist[1]: nextptr=int(tmplist[0][-6:],16)+int(tmplist[1][:-1],16) else: nextptr=int(tmplist[0][-6:],16)+int(tmplist[1],16) count+=1 simulate_xor(nextptr,instruction) tmp=str(idc.generate_disasm_line(nextptr+12,1)) print(tmp) if 'jz' not in tmp: print(count,hex(nextptr+12)) break if '+' not in tmp: start=int(tmp[-6:],16) else: tmplist=tmp.split('+') if 'h' in tmplist[1]: start=int(tmplist[0][-6:],16)+int(tmplist[1][:-1],16) else: start=int(tmplist[0][-6:],16)+int(tmplist[1],16) print(hex(start)) while(f.check()==sat): condition = [] m = f.model() p="" for i in range(61): p+=chr(int("%s" % (m[flag[i]]))) condition.append(flag[i]!=int("%s" % (m[flag[i]]))) print(p) f.add(Or(condition))
|