CTF中angr的简单使用
学习参考蓝鲸CTF0X01 安装angr一开始准备在deepin上直接安装搞了半天没搞定。最后听从了Thunder J师傅的建议安装了一个docker.docker安装教程0x02 例题1蓝鲸CTF r100将程序放入ida中观察流程发现有两处判断,一处判断输入是否成功。其中另一处就是判断就是判断输入值是否正确。这题可以分析算法获得flag。但是亦可以通过angr框架来解决,脚本及...
·
学习参考蓝鲸CTF
0X01 安装angr
一开始准备在deepin上直接安装搞了半天没搞定。最后听从了Thunder J师傅的建议
安装了一个docker.
docker安装教程
0x02 例题1蓝鲸CTF r100
将程序放入ida中观察流程
发现有两处判断,一处判断输入是否成功。其中另一处就是判断就是判断输入值是否正确。这题可以分析算法获得flag。但是亦可以通过angr框架来解决,脚本及注释如下
import angr
p=angr.Project('./r100',auto_load_libs=False)#加载二进制程序
state=p.factory.entry_state()#创建一个状态,默认为程序的入口地址
simgr=p.factory.simgr(state)#创建一个模拟器用来模拟程序执行
res=simgr.explore(find=0x400844,avoid=0x400855)#约束执行的流程,0x400844为打印nice附近的地址,0x400855附近即为打印错误的地址
print (res.found[0].posix.dumps(0))#打印found的第一个结果
打印结果如下显示即可得到flag
例题2 ais3_crackme
该程序带有参数,先放入IDA中看下把
int __cdecl main(int argc, const char **argv, const char **envp)
{
int result; // eax
if ( argc == 2 )
{
if ( (unsigned int)verify(argv[1], argv, envp) )
puts("Correct! that is the secret key!");
else
puts("I'm sorry, that's the wrong secret key!");
result = 0;
}
else
{
puts("You need to enter the secret key!");
result = -1;
}
return result;
}
首先argc要满足2个,其次还有一个判断输入,脚本如下
import angr
import claripy
proj = angr.Project('./ais3_crackme')
argv1 = claripy.BVS('argv1', 50*8)
state = proj.factory.entry_state(args=['./ais3_crackme',argv1])
simgr = proj.factory.simgr(state)
res=simgr.explore(find = 0x400602, avoid=0x40060e)
print(hex(res.found[0].solver.eval(argv1)))
打印出ASCII码
0x616973337b495f74616b335f673030645f6e307433737d000000000000000000000000000000000000000000000000000000
再去base16解密一下
得到flag
更多推荐
已为社区贡献1条内容
所有评论(0)