学习参考蓝鲸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

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐