CTF中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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值