Angr(二)——angr_ctf

通过angr_ctf熟悉angr的使用方法

参考链接:

bilibili - angr符号执行

GitHub - angr_ctf

00

1. 将angr_ctf提供的00_angr_find编译成Linux下的ELF可执行文件

2. 用IDA静态分析

    查看main函数

    main函数逻辑为:首先读取输入input,之后用complex_function函数对输入进行逐字符处理,如果处理后的字符串与"PASSWORD"相等,则输出Good Job,否则输出Try again。

    再查看complex_function函数

    complex_function函数逻辑为:检查当前字符是否为大写字母,如果不是则直接退出程序,否则对其进行变换,类似于维吉尼亚密码。

3. 编写脚本求解程序输出Good Job时对应的输入

import angr
p = angr.Project("./00")
init_state = p.factory.entry_state()
print(init_state)
sm = p.factory.simulation_manager(init_state)
sm.explore(find=0x40091E)
for i in range(0, len(sm.found)):
	found_state = sm.found[i]
	print(found_state.posix.dumps(i))

 4. 关于find值

        ① 输出init_state的值为0x4006F0,在IDA中看到start函数的入口地址为0x0006F0

        ② 在IDA中输出正确语句的地址在0x00091E,故应该在程序中指定find值为0x40091E

5. 运行脚本查看结果

6. 测试结果的正确性

 01

1. 直接下载angr_ctf提供的ELF可执行文件01_angr_avoid

2. 用IDA静态分析

    IDA反编译该文件花了较长时间,而且F5无法反编译main函数。看到一个名为maybe_good的函数,F5查看该函数源码

 3. 据此可以确定find值,编写脚本求解程序输出Good Job时对应的输入

import angr
p = angr.Project("./01")
init_state = p.factory.entry_state()
print(init_state)
sm = p.factory.simulation_manager(init_state)
sm.explore(find=0x80485F7, avoid=0x80485BF)
for i in range(0, len(sm.found)):
	found_state = sm.found[i]
	print(found_state.posix.dumps(i))

4. 关于avoid值

    设置avoid值可以避免对某条路径的探测,使探测更准确、速度更快。

5. 运行脚本查看结果

 6. 测试结果的正确性

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值