前言
最近由于遇到一些题需要使用angr框架解决。因此呢,学习一下吧,这个框架。
环境安装
https://github.com/angr
不多说了。说麻烦也挺麻烦。
题目一
其实算不上什么题目,自己写了个demo,用来看看angr的一些细节的东西。
代码如下:
#include<stdio.h>
void success(){
printf("success\n");
}
void failed(){
printf("failed\n");
}
int main(void){
char name[9];
scanf("%s",name);
if(!strcmp(name,"jsk")){
success();
}else{
failed();
}
return 0;
}
注意编译的时候要先关闭PIE,毕竟是作为demo用来学习angr用的。
在刚开始我用的是gets结果坑了自己一把,不信你可以去试试。嘿嘿
可以用checksec检查一下开启了哪些保护。
IDA查看,代码逻辑很简单就只有两个分支。
定位到两个分支对应的地址。
编写angr脚本。这里一点一点来。
from angr import * 导入angr
p = Project("test",auto_load_libs=False) 加载二进制程序
只需要关注一下这几个属性就可以了。这里首先了解一下factory,也就是工场的意思,创建了一个项目(Project)之后肯定需要一个工场来解决问题。
state=p.factory.entry_state()
接着创建一个状态,默认就是程序的入口地址
也可以指定一个地址作为入口地址
sm=p.factory.simulation_manager(state) 创建一个模拟器用来模拟程序执行。
res=sm.explore(find=0x4005fb,avoid=0x400607)
使用explore执行模拟器,find和avoid用来作为约束条件。
可见found了一个结果。
res.found[0].posix.dumps(0)
完整脚本如下:
from angr import *
import logging
logging.getLogger('angr.manager').setLevel(logging.DEBUG) #用来记录日志
p = Project("test",auto_load_libs=False)
state=p.factory.entry_state()
sm=p.factory.simulation_manager(state)
res=sm.explore(find=0x4005fb,avoid=0x400607)
print len(res.found)
if len(res.found) > 0:
print res.found[0].posix.dumps(0)
总结
今天对angr有了初步的认识,明天在进一步的学习。睡觉,晚安!