angr学习【一】

前言

最近由于遇到一些题需要使用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有了初步的认识,明天在进一步的学习。睡觉,晚安!

猜你喜欢

转载自blog.csdn.net/qq_33438733/article/details/80276628
今日推荐