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

 

posted @ 2022-12-13 00:00  Qsons  阅读(199)  评论(0编辑  收藏  举报