BUUCTF子[网鼎杯 2020 青龙组]singal(angr快速嗦哈解法)
先查壳,发现是32位程序
丢ida继续分析,发现存在vm_opread函数,根据以往做题经验来看,这个题像是虚拟机保护的题目。
这里首先是将opcode_table(我自己命的名字)复制前456个字节给v4,然后再把v4和114传入vm_opread.
我们可以去看看opcode_table表里面有什么数据?
发现普遍都是一些小的操作数,而在汇编中,通常以机器码来代替指令,如mov,nop,add,sub,push,pop等指令都有相应的操作数,这里很可能就类似于指令集。
继续对vm_opread函数进行分析。
发现存在while+switch分支,所以我们可以确定这是一道vm保护的题目。在vm_opread函数中一共有11种指令集,对应这里面函数的case也刚好是11种。
在case10我们发现有存在read(Str)函数,发现是让我们输入长度为15的字符串,然后存入Str,外面的case就是对case进行一些操作。
而最终我们要解出这道题的关键就是,v9要大于114(前面main函数中传参进来的)。执行到这里我们的就可以拿到flag
而在众多case中,除了case10初始输入之外,还有case7的情况需要注意,不能跳到case7里面去,不然程序直接退出了。
这里我是用angr的解法,在笔记本上直接wsl+虚拟环境+angr做的。
顺便说一下angr的安装流程
先看看有没有pip3或者Pip,我这里是pip3.
然后记得安装python,不建议python3.6版本以下,容易出问题~~.
关键的一点来了,就是安装虚拟环境
pip3 install virtualenv 或 pip install virtualenv 都可以!!!
安装完之后,在你常做题的目录下建一个文件夹,名字随便取,看个人喜好。建错地方也没关系,到时候开环境后,切到做题的目录就可以了,不影响。
然后创立一个独立的环境
virtualenv -p 自己安装python的位置(用whereis python或python3查,填第一个就可以了) myenv
譬如我这里就是,virtualenv -p /usr/bin/python3 myenv
然后启动环境:source myenv/bin/activate
成功进入到虚拟环境后,我们就可以安装angr了
安装angr:pip3 install angr 或 pip install angr
安装省略1w字
最后输入python3,输入import angr,看有没有报错,没有报错说明安装成功!!!
angr的用法:
启动环境:source xxx(虚拟环境的文件夹,前提是你在那个目录下)/bin/activate
导入angr库:import angr
proj = angr.Project('文件名') # 新建一个工程
init_state=proj.factory.entry_sate() # 设置程序的入口
sm=proj.factory.simulation_manager(init_state) # 执行程序
sm.explore(find=0x......... , avoid=0x...........) find表示执行到某个条件,avoid表示避免某个条件
sm.found[0] # 找到符合条件的值
退出环境:deactivate
这里题目,因为我们需要跳转到_eip也就是v9刚好大于等于114的时候,程序就可以模拟出此时的结果。同时也要避免case 7的那种情况存在,所以我们直接动态调试,找地址,然后写脚本
可以看到在执行后,发现有很多报红,原因是因为我没有设置更多的约束条件。
最后print(sm.found[0].posix.dumps(0))即可
可以看到已经模拟执行,flag成功出来了
flag{757515121f3d478}
解毕
参考资料:https://xz.aliyun.com/t/3990
https://blog.csdn.net/weixin_52369224/article/details/121319151
https://blog.csdn.net/a_touhouer/article/details/106058311