180131 逆向-Angr入门(2)

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!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值