angr解题
1 minute read
0x00 About
1.kali linux安装angr
apt-get install python-dev libffi-dev build-essential virtualenvwrapper
mkvirtualenv angr && pip install angr
2.必读link
1)用法小结
2)api文档
3)进阶文档
0x01 注意
1.获取程序的输出的值的方法为ex.found[0].posix.dumps(1)
2.如果程序不能从开头执行(如:开头损坏),则可用state = p.factory.blank_state(addr=xxx)
,从开头运行则可用
p.factory.entry_state
,更多的state运行方法参考这里
3.目前的理解是find是到哪里停,avoid是不能经过哪,在解题时,avoid可没有,find必需有,但是最好两者都有,这样可减少符号执 行的计算量
4.通过字符串设置find方法:pg.explore(find=lambda s:"it is my secret" ins.posix.dumps(1))
5.claripy的BVS函数可以创建一个指定长度的抽象数据,如下,要注意的是:BVS的第2个参数的大小是位数,不是字节数,claripy的 功能与z3相当
import claripy
a = claripy.BVS("sym_val", 32)
b = claripy.RotateLeft(a, 8)
c = b + 4
s = claripy.Solver()
s.add(c == 0x41424344)
assert s.eval(c, 1)[0] == 0x41424344
assert s.eval(a, 1)[0] == 0x40414243
0x02 解题
0xa 命令行参数
从命令行提供程序参数:
p = angr.Project('./ais3_crackme')
arg1=claripy.BVS('arg1',30*8)
state=p.factory.entry_state(args=[p.filename,arg1])
最后获取命令行参数值:
arg1=ex.found[0].solver.eval(arg1,cast_to = str)
解法:
import angr
import claripy
find = 0x400602
avoid = [0x40060e]
p = angr.Project('./ais3_crackme')
arg1 = claripy.BVS('arg1', 30 * 8)
state = p.factory.entry_state(args=[p.filename, arg1])
ex = p.factory.simgr(state)
ex.explore(find=find, avoid=avoid)
arg1 = ex.found[0].solver.eval(arg1, cast_to=str)
print(arg1)
0xb 标准输入
从标准输入中提供程序参数:
state.posix.files[0].read_from(30)
或
for _ in xrange(5):
k = state.posix.files[0].read_from(1)
state.se.add(k!=10)
最后获取标准输入值:
inp = ex.found[0].posix.files[0].all_bytes()
print ex.found[0].solver.eval(inp,cast_to = str)
解法:
import angr
find = (0x8048697,)
avoid = (0x804869e,)
p = angr.Project('./ppp')
state = p.factory.entry_state()
state.posix.files[0].read_from(50)
pg = p.factory.simgr(state, threads=8)
ex = pg.explore(find=find, avoid=avoid)
output = ex.found[0].posix.dumps(1)
print(output)
inp = ex.found[0].posix.files[0].all_bytes()
print ex.found[0].solver.eval(inp, cast_to=str)
0xc 文件输入
从文件中提供程序’参数’
解法:
to be continue…