通过angr_ctf熟悉angr的使用方法
参考链接:
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. 测试结果的正确性