angr学习笔记(4) (寄存器符号化)
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
过程分析
- 改变
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)
- :param name: 符号的名字.
- :param size: 位向量的大小(以位为单位)
- :param min: 符号的最小值,仅用于值集分析
- :param max: 符号的最大值,仅用于值集分析
- :param stride: 符号的stride(步幅),仅用于值集分析
- :param uninitialized: 在分析过程中,这个值是否应该被视为一个未初始化的值.
- :param bool explicit_name: 如果为False, 则将名称附加标识符以确保唯一性.
- :param bool discrete_set: 如果为True, 则将使用DiscreteStridedIntervalSet而不是普通的StridedInterval.
- :param int discrete_set_max_card: 离散集合的最大基数。如果discrete_set设置为False或None,则忽略它.
- :returns: 代表该符号的BV对象.
另一个创建符号变量的函数为claripy.BVV(),用于创建一个位向量 (即,一个具体值)(后面会说)。
函数参数:
def BVV(value, size=None, **kwargs):
- :param value: 值, 整数或字符串。如果是字符串, 它将被解释为一个大端常量的字节。
- :param size: 位向量的大小(以位为单位)。 如果值是字符串则可选,如果值是整数,则必须指定。
- :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) (寄存器符号化)相关推荐
- 嵌入式学习笔记——使用寄存器编程操作GPIO
使用寄存器编程操作GPIO 前言 GPIO相关的寄存器 GPIO 端口模式寄存器 (GPIOx_MODER) (x = A..I) 位操作 GPIO 端口输出类型寄存器 (GPIOx_OTYPER) ...
- angr学习笔记(6)(内存地址单元符号化)
angr系列 00_angr_find 01_angr_avoid 02_angr_find_condition 03_angr_symbolic_registers 04_angr_symbolic ...
- angr学习笔记(5)(栈符号化)
angr系列 00_angr_find 01_angr_avoid 02_angr_find_condition 03_angr_symbolic_registers 04_angr_symbolic ...
- angr学习笔记(8)(文件内容符号化)
angr系列 00_angr_find 01_angr_avoid 02_angr_find_condition 03_angr_symbolic_registers 04_angr_symbolic ...
- angr学习笔记(7)(malloc地址单元符号化)
angr系列 00_angr_find 01_angr_avoid 02_angr_find_condition 03_angr_symbolic_registers 04_angr_symbolic ...
- angr学习笔记(2)
angr系列 00_angr_find 01_angr_avoid 02_angr_find_condition 03_angr_symbolic_registers 04_angr_symbolic ...
- angr学习笔记(9)(添加约束)
angr系列 00_angr_find 01_angr_avoid 02_angr_find_condition 03_angr_symbolic_registers 04_angr_symbolic ...
- angr学习笔记(13)(static_binary)
angr系列 00_angr_find 01_angr_avoid 02_angr_find_condition 03_angr_symbolic_registers 04_angr_symbolic ...
- angr学习笔记(11)(SimProcedure)
angr系列 00_angr_find 01_angr_avoid 02_angr_find_condition 03_angr_symbolic_registers 04_angr_symbolic ...
最新文章
- Android Studio停留在“Indexing paused due to batch update”的解决方案
- delphi批量存入多媒体字段 遇到内存溢出的坑
- Tensorflow Day17 Sparse Autoencoder
- 连载:阿里巴巴大数据实践—实时技术
- 机器人等级考试一级教具_机器人等级考试一级之“齿轮”
- 矩阵键盘程序_独立按键与矩阵按键
- selenium自动化测试_为什么在生产中进行Selenium自动化测试对于您的下一个版本至关重要?...
- python经典书 豆瓣_入门,,豆瓣高分推荐的Python书籍
- pymysql模块的使用
- php二维数组的某一字段 做分组统计
- 推荐一款超好用的vue的markdown 编辑器
- vmware linux ssh密码,使用 SSH 密钥连接到 Linux VM - Azure Linux Virtual Machines | Azure Docs...
- 成品app直播源码,设置ViewPager不可滑动
- 关于分布式服务中的中间件技术入门概述
- 董明珠成为带货女王,并非格力值得高兴的事情
- backdrop-filter高斯模糊
- 【论文翻译】High-Performance Long-Term Tracking with Meta-Updater
- plsql tables 里面不显示表格
- 教师计算机基础知识培训简报,信息技术能力提升培训简报.doc
- 邀请返现php怎么实现_PHP实现财务审核通过后返现金额到客户的功能
热门文章
- ML之Xgboost:利用Xgboost模型(7f-CrVa+网格搜索调参)对数据集(比马印第安人糖尿病)进行二分类预测
- Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(计算器简单功能)
- 自定义元类控制类的实例化行为
- 关于UNION ALL与 UNION 用法和区别
- C语言,获得堆栈增长方向的一种方法
- Silverlight中服务通信方式的选择(WCF、Data Service、Ria Service)
- 几个网页制作的小技巧
- vba 单元格 一系例操作
- 再学 GDI+[79]: 区域(8) - Transform - 区域的 Matrix 变换
- vmalloc 实现