angr系列

00_angr_find

01_angr_avoid

02_angr_find_condition

03_angr_symbolic_registers

04_angr_symbolic_stack

05_angr_symbolic_memory

06_angr_symbolic_dynamic_memory

07_angr_symbolic_file

08_angr_constraints

09_angr_hooks

10_angr_simprocedures

13_angr_static_binary

文章目录

  • angr系列
    • 00_angr_find
    • 01_angr_avoid
    • 02_angr_find_condition
    • 03_angr_symbolic_registers
    • 04_angr_symbolic_stack
    • 05_angr_symbolic_memory
    • 06_angr_symbolic_dynamic_memory
    • 07_angr_symbolic_file
    • 08_angr_constraints
    • 09_angr_hooks
    • 10_angr_simprocedures
    • 13_angr_static_binary
  • 伪代码分析
  • 过程分析
  • 脚本:
  • 验证

伪代码分析



汇编代码为:

这里的话,我们需要把start_address放在0x0804898C

.text:0804890C push    ebp
.text:0804890D mov     ebp, esp
.text:0804890F sub     esp, 18h
.text:08048912 mov     ecx, large gs:14h
.text:08048919 mov     [ebp+var_C], ecx
.text:0804891C xor     ecx, ecx
.text:0804891E lea     ecx, [ebp+var_10]
.text:08048921 push    ecx
.text:08048922 lea     ecx, [ebp+var_14]
.text:08048925 push    ecx
.text:08048926 lea     ecx, [ebp+var_18]
.text:08048929 push    ecx
.text:0804892A push    offset aXXX     ; "%x %x %x"
.text:0804892F call    ___isoc99_scanf
.text:08048934 add     esp, 10h
.text:08048937 mov     ecx, [ebp+var_18]
.text:0804893A mov     eax, ecx
.text:0804893C mov     ecx, [ebp+var_14]
.text:0804893F mov     ebx, ecx
.text:08048941 mov     ecx, [ebp+var_10]
.text:08048944 mov     edx, ecx
.text:08048946 nop
.text:08048947 mov     ecx, [ebp+var_C]
.text:0804894A xor     ecx, large gs:14h
.text:08048951 jz      short locret_804

然后从右往左填参数,ebp+var_10为第三个输入参数,ebp+var_14为第二个输入参数,ebp+var_18为第一个输入参数,也就是说,寄存器返回值中,eax是第一个输入参数,ebx是第二个输入参数,edx是第三个输入参数,紧接着往下:

.text:0804896E push    offset aEnterThePasswo ; "Enter the password: "
.text:08048973 call    _printf
.text:08048978 add     esp, 10h
.text:0804897B call    get_user_input
.text:08048980 mov     [ebp+var_14], eax
.text:08048983 mov     [ebp+var_10], ebx
.text:08048986 mov     [ebp+var_C], edx
.text:08048989 sub     esp, 0Ch
.text:0804898C push    [ebp+var_14]
.text:0804898F call    complex_function_1
.text:08048994 add     esp, 10h
.text:08048997 mov     ecx, eax
.text:08048999 mov     [ebp+var_14], ecx
.text:0804899C sub     esp, 0Ch
.text:0804899F push    [ebp+var_10]
.text:080489A2 call    complex_function_2
.text:080489A7 add     esp, 10h
.text:080489AA mov     ecx, eax
.text:080489AC mov     [ebp+var_10], ecx
.text:080489AF sub     esp, 0Ch
.text:080489B2 push    [ebp+var_C]
.text:080489B5 call    complex_function_3
.text:080489BA add     esp, 10h
.text:080489BD mov     ecx, eax
.text:080489BF mov     [ebp+var_C], ecx
.text:080489C2 cmp     [ebp+var_14], 0
.text:080489C6 jnz     short loc_8048

过程分析

  1. 改变start_address
     p=angr.Project(bin_path)start_addr=0x08048980init_state=p.factory.blank_state(addr=start_addr)
    pass1=claripy.BVS('pass1',32)pass2=claripy.BVS('pass2',32)pass3=claripy.BVS('pass3',32)init_state.regs.eax=pass1init_state.regs.ebx=pass2init_state.regs.edx=pass3

调用的函数为claripy.BVS(),该函数实际存在于claripy.ast.bv.py文件中。它的作用就是创建一个为符号向量(即,一个变量)。
函数参数:

claripy.ast.bv.BVS(name, size, min=None, max=None, stride=None, uninitialized=False, explicit_name=None, discrete_set=False, discrete_set_max_card=None, **kwargs)
  1. :param name: 符号的名字.
  2. :param size: 位向量的大小(以位为单位)
  3. :param min: 符号的最小值,仅用于值集分析
  4. :param max: 符号的最大值,仅用于值集分析
  5. :param stride: 符号的stride(步幅),仅用于值集分析
  6. :param uninitialized: 在分析过程中,这个值是否应该被视为一个未初始化的值.
  7. :param bool explicit_name: 如果为False, 则将名称附加标识符以确保唯一性.
  8. :param bool discrete_set: 如果为True, 则将使用DiscreteStridedIntervalSet而不是普通的StridedInterval.
  9. :param int discrete_set_max_card: 离散集合的最大基数。如果discrete_set设置为False或None,则忽略它.
  10. :returns: 代表该符号的BV对象.

另一个创建符号变量的函数为claripy.BVV(),用于创建一个位向量 (即,一个具体值)(后面会说)。

函数参数:

def BVV(value, size=None, **kwargs):
  1. :param value: 值, 整数或字符串。如果是字符串, 它将被解释为一个大端常量的字节。
  2. :param size: 位向量的大小(以位为单位)。 如果值是字符串则可选,如果值是整数,则必须指定。
  3. :returns: 代表该值的BV对象。

创建符号变量后,需要指定符号执行的起始状态,也就是从程序的哪个部分开始执行符号执行

最后再来对变量进行求解

     password1=found_state.solver.eval(pass1)password2=found_state.solver.eval(pass2)password3=found_state.solver.eval(pass3)

脚本:

import angr
import sys
import claripydef main(argv):bin_path=argv[1]p=angr.Project(bin_path)start_addr=0x08048980init_state=p.factory.blank_state(addr=start_addr)pass1=claripy.BVS('pass1',32)pass2=claripy.BVS('pass2',32)pass3=claripy.BVS('pass3',32)init_state.regs.eax=pass1init_state.regs.ebx=pass2init_state.regs.edx=pass3sm=p.factory.simulation_manager(init_state)def is_good(state):return b'Good Job.' in state.posix.dumps(1)def is_bad(state):return b'Try again.' in state.posix.dumps(1)sm.explore(find=is_good,avoid=is_bad)if sm.found:found_state=sm.found[0]password1=found_state.solver.eval(pass1)password2=found_state.solver.eval(pass2)password3=found_state.solver.eval(pass3)print("Solution:{} {} {}".format(password1,password2,password3))else:raise Exception("No solution found")if __name__=='__main__':main(sys.argv)

3120549966 3438690280 2413091161

十六进制显示:

print("Solution:{:x} {:x} {:x}".format(password1,password2,password3))

b9ffd04e ccf63fe8 8fd4d959

验证

     password1=found_state.solver.eval(pass1)password2=found_state.solver.eval(pass2)password3=found_state.solver.eval(pass3)

这里通过求解的方式,而不是通过下方这种打印出 标准输入值

print("stdin:",found_state.posix.dumps(0));

这种方式打印出来是空,因为我们没有执行scanf那一个函数,而是直接跳过了。

angr学习笔记(4) (寄存器符号化)相关推荐

  1. 嵌入式学习笔记——使用寄存器编程操作GPIO

    使用寄存器编程操作GPIO 前言 GPIO相关的寄存器 GPIO 端口模式寄存器 (GPIOx_MODER) (x = A..I) 位操作 GPIO 端口输出类型寄存器 (GPIOx_OTYPER) ...

  2. angr学习笔记(6)(内存地址单元符号化)

    angr系列 00_angr_find 01_angr_avoid 02_angr_find_condition 03_angr_symbolic_registers 04_angr_symbolic ...

  3. angr学习笔记(5)(栈符号化)

    angr系列 00_angr_find 01_angr_avoid 02_angr_find_condition 03_angr_symbolic_registers 04_angr_symbolic ...

  4. angr学习笔记(8)(文件内容符号化)

    angr系列 00_angr_find 01_angr_avoid 02_angr_find_condition 03_angr_symbolic_registers 04_angr_symbolic ...

  5. angr学习笔记(7)(malloc地址单元符号化)

    angr系列 00_angr_find 01_angr_avoid 02_angr_find_condition 03_angr_symbolic_registers 04_angr_symbolic ...

  6. angr学习笔记(2)

    angr系列 00_angr_find 01_angr_avoid 02_angr_find_condition 03_angr_symbolic_registers 04_angr_symbolic ...

  7. angr学习笔记(9)(添加约束)

    angr系列 00_angr_find 01_angr_avoid 02_angr_find_condition 03_angr_symbolic_registers 04_angr_symbolic ...

  8. angr学习笔记(13)(static_binary)

    angr系列 00_angr_find 01_angr_avoid 02_angr_find_condition 03_angr_symbolic_registers 04_angr_symbolic ...

  9. angr学习笔记(11)(SimProcedure)

    angr系列 00_angr_find 01_angr_avoid 02_angr_find_condition 03_angr_symbolic_registers 04_angr_symbolic ...

最新文章

  1. Android Studio停留在“Indexing paused due to batch update”的解决方案
  2. delphi批量存入多媒体字段 遇到内存溢出的坑
  3. Tensorflow Day17 Sparse Autoencoder
  4. 连载:阿里巴巴大数据实践—实时技术
  5. 机器人等级考试一级教具_机器人等级考试一级之“齿轮”
  6. 矩阵键盘程序_独立按键与矩阵按键
  7. selenium自动化测试_为什么在生产中进行Selenium自动化测试对于您的下一个版本至关重要?...
  8. python经典书 豆瓣_入门,,豆瓣高分推荐的Python书籍
  9. pymysql模块的使用
  10. php二维数组的某一字段 做分组统计
  11. 推荐一款超好用的vue的markdown 编辑器
  12. vmware linux ssh密码,使用 SSH 密钥连接到 Linux VM - Azure Linux Virtual Machines | Azure Docs...
  13. 成品app直播源码,设置ViewPager不可滑动
  14. 关于分布式服务中的中间件技术入门概述
  15. 董明珠成为带货女王,并非格力值得高兴的事情
  16. backdrop-filter高斯模糊
  17. 【论文翻译】High-Performance Long-Term Tracking with Meta-Updater
  18. plsql tables 里面不显示表格
  19. 教师计算机基础知识培训简报,信息技术能力提升培训简报.doc
  20. 邀请返现php怎么实现_PHP实现财务审核通过后返现金额到客户的功能

热门文章

  1. ML之Xgboost:利用Xgboost模型(7f-CrVa+网格搜索调参)对数据集(比马印第安人糖尿病)进行二分类预测
  2. Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(计算器简单功能)
  3. 自定义元类控制类的实例化行为
  4. 关于UNION ALL与 UNION 用法和区别
  5. C语言,获得堆栈增长方向的一种方法
  6. Silverlight中服务通信方式的选择(WCF、Data Service、Ria Service)
  7. 几个网页制作的小技巧
  8. vba 单元格 一系例操作
  9. 再学 GDI+[79]: 区域(8) - Transform - 区域的 Matrix 变换
  10. vmalloc 实现