180130 逆向-angr入门(1)_奈沙夜影的博客-爱代码爱编程
1625-5 王子昂 总结《2018年1月30日》 【连续第487天总结】
A. 蓝鲸whale-angr学习
B.
Angr是一个多架构的动态符号执行的框架
符号执行就是将输入抽象成一个符号(而不是具体值),分析这个符号的变化,来对应程序的路径
早期符号执行是静态的,依靠分析程序代码来进行工作
后来发展出了动态的符号执行,模拟执行该程序来工作
Angr载入二进制文件后,会将其转换为中间语言(字节码),然后进行一定程度的静态分析,以及对程序状态空间的探索,最后将上述情况混合得出结果
eg:
v3 = "Dufhbmf";
v4 = "pG`imos";
v5 = "ewUglpt";
for ( i = 0; i <= 11; ++i )
{
if ( (&v3)[i % 3][2 * (i / 3)] - *(char *)(i + a1) != 1 )
return 1LL;
}
return 0LL;
}
一个简单的对输入进行check的程序
虽然代码很容易读懂,但是理解起来还是要稍微分一点功夫的
再加上dump字符串、写脚本处理等等 5-10min还是需要的
但是用如下的几行代码,在短短几十秒钟内就可以得到结果
In [17]: proj = angr.Project("./r100")
In [18]: state = proj.factory.entry_state()
In [19]: simgr = proj.factory.simgr(state)
In [20]: simgr.explore(find=0x400844, avoid=0x400855)
WARNING | 2018-02-03 03:08:36,391 | angr.procedures.definitions | unsupported syscall: sys_101
Out[20]: <SimulationManager with 2 active, 1 found, 12 avoid>
In [21]: simgr.found[0].posix.dumps(0)
Out[21]: 'Code_Talkers\
明天再多练习一些进阶的情况
angr的局限性在于如果路径过多、限制条件过于复杂,由于原理是遍历路径、约束求解符号,因此会消耗大量的时间和内存
C. 明日计划
angr