前言:
资源链接:GitHub - jakespringer/angr_ctf(题库仓库,里面有个讲解angr的PPT,里面有官方的题解很详细) GitHub - Hustcw/Angr_Tutorial_For_CTF: angr tutorial for ctf
安装:
关于angr的安装:官方提供了很多安装教程方式 这里用的是Anaconda来安装python然后安装angr https://mirrors.bfsu.edu.cn/anaconda/archive/Anaconda3-2022.10-Linux-x86_64.sh 去这里下载安装文件,不建议用wget下载,很慢很慢。 然后:
bash Anaconda3-2022.10-Linux-x86_64.sh 回车后查看许可证,按 q 退出许可证,然后输入 yes 表示同意 确认安装的路径,一般直接回车安装在默认的 /home/你的名字/anaconda 很快就安装完毕。输入 yes 来确认使用 conda init 来启动 source ~/.bashrc //修改环境变量 然后就可以命令行输入conda直接来使用了
conda的常用命令:
conda create -n name python=版本号 //name 为要创建的环境名 conda activate name //进入环境 conda deactivate //退出环境 conda info conda info -e //查看已经创建的环境
然后创建环境:
进入环境安装angr:
安装成功测试:
正文:
官方文档:Core Concepts - angr documentation 翻译版本:angr学习(2):基本命令 · 语雀 SymbolicExecution.pptx 常用命令:
import angr import claripy proj = angr.Project('./file_name') //load the binary file proj.arch //arch of the binary file proj.entry // the entry of the binary file state = proj.factory.entry_state() //to create the state start_addr = 0xdeadbeef state = proj.factory.blank_state(addr=start_addr) // to create a blank stateand we set the regs parameter_1 = claripy.BVS("p1",32) state.regs.eax = parameter_1 simgr = proj.factory.simulation_manger(state) //to create the simulation simgr.explore(find=???,avoid=???) solution = simgr.found[0] print(solution.posix.dumps(0)) // '0' represents standard output solution = state.solver.eval(parameter_1) print("Solution:",hex(solution))
00_angr_find
import angr def exp(): proj = angr.Project('./00_angr_find') state = proj.factory.entry_state() simgr = proj.factory.simulation_manager(state) simgr.explore(find=0x08048678) if simgr.found: solution = simgr.found[0] print("solution:",solution.posix.dumps(0)) else: print("Not found") if __name__ == "__main__": exp()
01_angr_avoid
由于一些原因F5反编译main函数有点麻烦,修改IDA设置可以解决,但是本题影响不大
整个函数逻辑流程和00_angr_find一样,只不过加入了个分支avoid_me,倘若angr的explore中不加avoid参数,应该也能跑出来,只不过加了后直接会跳过那个avoid_me的分支,加快速度。
import angr def exp(): proj = angr.Project('./01_angr_avoid') state = proj.factory.entry_state() simgr = proj.factory.simulation_manager(state) simgr.explore(find=0x080485E0,avoid=0x080485A8) if simgr.found[0]: solution = simgr.found[0] print("solution:",solution.posix.dumps(0)) else: print("Not found") if __name__ == "__main__": exp()
02_angr_find_condition
看这里没啥区别,但是: