常规第一步用exeinfope查壳
在虚拟机尝试运行
不能正常运行,利用ida打开,在函数列表中没有找到主函数,在IDA View中找到了主函数main,没有被定义
往下找发现花指令,这也是我第一次接触到花指令
这里的jz short near ptr loc_40061A+1和jnz short near ptr loc_40061A+1肯定是有问题的,还有call near ptr 0FFFFFFFF810037AFh的地址很奇怪,需要修改,根据之后的函数
要修改成这个样子,网上师傅的nop哪,没有说,只是说了需要nop掉花指令,按照自己的理解我nop掉了 jz short near ptr loc_40061A+1、jnz short near ptr loc_40061A+1、call near ptr 0FFFFFFFF810037AFh和jz short near ptr loc_400621+2不可行,会出现下面的情况
我也是第一次接触花指令,不知道为什么,翻了网上师傅的writeup,慢慢尝试发现原来需要nop成这样:
后面的三次,就不一一展示
然后就是定义函数,定义的方法就是选中范围然后按热键P
需要P两处
得到main函数为:
多次异或,大概350次,没办法,找到了师傅的脚本:
import angr
import claripy
p=angr.Project('D:\桌面\缓存\[WUSTCTF2020]funnyre/attachment',load_options={"auto_load_libs": False})
f=p.factory
state = f.entry_state(addr=0x400605)#设置state开始运行时的地址
flag = claripy.BVS('flag',8*32)#要求的内容有32个,用BVS转成二进制给flag变量
state.memory.store(0x603055+0x300+5,flag)#因为程序没有输入,所以直接把字符串设置到内存
state.regs.rdx=0x603055+0x300
state.regs.rdi=0x603055+0x300+5#然后设置两个寄存器
sm = p.factory.simulation_manager(state)#准备从state开始遍历路径
print("ready")
sm.explore(find=0x401DAE)#遍历到成功的地址
if sm.found:
print("sucess")
x=sm.found[0].solver.eval(flag,cast_to=bytes)
print(x)
else:
print('error')
得到:
最后flag{1dc20f6e3d497d15cef47d9a66d6f1af}