1625-5 王子昂 总结《2018年1月31日》 【连续第488天总结】
A. 蓝鲸whale-angr学习
B.
今天尝试了通过参数来传递输入的形式
之前没有控制参数,实际上是可以通过
import claripy
claripy.BVS('arg1', n*8)
的形式制造n字节参数的
entry_state方法的参数有一个args来控制输入参数
例如一个很简单的程序
*(&_0 - 3) = a1;
for ( i = 0; *(_BYTE *)(i + *(&_0 - 3)); ++i )
{
v2 = *(_BYTE *)(i + *(&_0 - 3)) ^ i;
v2 = (v2 << ((i ^ 9) & 3)) | ((signed int)v2 >> (8 - ((i ^ 9) & 3)));
v2 += 8;
if ( encrypted[i] != v2 )
return 0LL;
}
return i == 23;
}
显然只是高低比特的交换,但是算法写起来还是有点烦的
以及之前做的时候因为有一个小于8的数,再加上+8的变换,涉及到字节的截断处理坑了不少时间。。。
另一个小兄弟用了爆破的法子,但是逻辑是自己写的,因为那个字节截断的问题导致复刻不完全,也一样被坑着了
而符号执行就没这些事了,把输入和约束条件给好它自己搞定
import angr
import claripy
proj = angr.Project("./ais3_crackme")
args = [proj.filename, claripy.BVS('arg1', 50*8)]
state = proj.factory.entry_state(args=args)
simgr = proj.factory.simgr(state)
simgr.explore(find = 0x400602, avoid=0x40060e)
simgr.found[0].solver.eval(args[1], cast_to=str)
‘ais3{I_tak3_g00d_n0t3s}\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00’
这个时间稍微长一点儿,不过也比纠结算法的时间快多啦
另外在freebuf上还看到过一篇入门级的教程
使用脚本的方法不完全相同
链接:http://www.freebuf.com/articles/web/150296.html
现在理解更近了一步以后可以考虑结合起来使用
代码摘录于此
import angr
import sys
print "[*]start------------------------------------"
p = angr.Project(sys.argv[1]) # 建立工程初始化二进制文件
state = p.factory.entry_state() # 获取入口点处状态
'''
state.posix.files[0].read_from(1)表示从标准输入读取一个字节
'''
for _ in xrange(int(sys.argv[2])): # 对输入进行简单约束(不为回车)
k = state.posix.files[0].read_from(1)
state.se.add(k!=10)
k = state.posix.files[0].read_from(1)
state.se.add(k==10) # 回车为结束符
state.posix.files[0].seek(0)
state.posix.files[0].length = int(sys.argv[2])+1 # 约束输入长度(大于实际长度也可)
print "[*]simgr start-------------------------------"
sm = p.factory.simgr(state) # 初始化进程模拟器
sm.explore(find=lambda s:"correct!" in s.posix.dumps(1)) # 寻找运行过程中存在 “correct!”的路径,并丢弃其他路径
print "[*]program excuted---------------------------"
for pp in sm.found:
out = pp.posix.dumps(1) # 表示程序的输出
print out
inp = pp.posix.files[0].all_bytes() # 取输入的变量
print pp.solver.eval(inp,cast_to = str) # 利用约束求解引擎求解输入
C. 明日计划
刷爆whale!