Angr 03_angr_symbolic_registers 多个输入的寄存器符号化

article/2025/11/8 7:26:38

直接打开程序,发现要输入三个字符串。
1

用IDA打开程序,get_user_input把三个输入分别放入寄存器eax、ebx、edx。我们需要跳过输入这一步,直接让Angr把用符号向量来代替输入字符串。因此,我们需要改变程序入口,直接跳转到参数入栈的位置,然后新建三个符号向量,并把三个符号向量分别放到寄存器eax、ebx、edx。
1
%x表示输入字符是十六进制。

1

import angr
import claripy
import sysdef main(argv):path_to_binary = argv[1]project = angr.Project(path_to_binary)# 重新设定入口点,此处从sanf输入开始执行。此处不用entry_state,而是blank_statestart_address = 0x08048980initial_state = project.factory.blank_state(addr=start_address)# 创建三个个符号向量,第一个参数是用来引用的,第二个参数是CPU位数,如32password0 = claripy.BVS('password0', 32)password1 = claripy.BVS('password1', 32)password2 = claripy.BVS('password2', 32)# 根据IDA,分别设置eax、ebx、edx的符号值initial_state.regs.eax = password0initial_state.regs.ebx = password1initial_state.regs.edx = password2simulation = project.factory.simgr(initial_state)def is_successful(state):stdout_output = state.posix.dumps(sys.stdout.fileno())return b'Good Job.' in stdout_outputdef should_abort(state):stdout_output = state.posix.dumps(sys.stdout.fileno())return b'Try again.' in stdout_outputsimulation.explore(find=is_successful, avoid=should_abort)if simulation.found:solution_state = simulation.found[0]# 求解solution0 = solution_state.solver.eval(password0)solution1 = solution_state.solver.eval(password1)solution2 = solution_state.solver.eval(password2)# 打印输出十六进制solution = "Solutions:{:x} {:x} {:x}".format(solution0, solution1, solution2)print(solution)else:raise Exception('Could not find the solution')if __name__ == '__main__':main(sys.argv)

1
附录:
C语言占位符:
%d, %i 代表整数
%f 浮点
%s 字符串
%c char
%p 指针
%fL 长log
%e 科学计数
%g 小数或科学计数。
%a,%A 读入一个浮点值(仅C99有效)。
%c 读入一个字符。
%d 读入十进制整数。
%i 读入十进制,八进制,十六进制整数。
%o 读入八进制整数。
%x,%X 读入十六进制整数。
%s 读入一个字符串,遇空格、制表符或换行符结束。
%f,%F,%e,%E,%g,%G 用来输入实数,可以用小数形式或指数形式输入。
%p 读入一个指针。
%u 读入一个无符号十进制整数
%n 至此已读入值的等价字符数。
%[] 扫描字符集合。
%% 读 % 符号

scanf("%d,%d,%d",&a,&b,&c); // 从键盘输入三个整数,用逗号分隔  
scanf("%c", &s);   // 从键盘输入一个字符  
scanf("%f", &f);   // 从键盘输入一个浮点型数据  
printf("%d\n",a);  // 输出一个整数  
printf("%f\n",b);  // 输出一个浮点数  
printf("%s\n",c);  // 输出一个字符, 其中\n表示换行

http://chatgpt.dhexx.cn/article/X9BViZg7.shtml

相关文章

angr 9二进制分析的常见问题集锦

问题: 用angr的库函数识别api去分析blob的二进制文件,报错。 AttributeError: ‘SimOS’ object has no attribute ‘syscall_library’ 原因: angr库函数识别不支持非CGC的二进制文件。 参考链接: https://github.com/angr/ang…

CTF 逆向工具angr的学习笔记

angr 概述如何学习题目列表00_angr_find01_angr_avoid02_angr_find_condition03_angr_symbolic_registers04_angr_symbolic_stack05_angr_symbolic_memory06_angr_symbolic_dynamic_memory07_angr_symbolic_file08_angr_constraints09_angr_hooks10_angr_simprocedures11_angr_…

angr初探

angr 安装与简单使用 介绍 angr 总结来说,angr用于逆向工程中进行二进制分析的一个python框架 具体介绍见其github主页angr 符号执行 符号执行 (Symbolic Execution)是一种程序分析技术。其可以通过分析程序来得到让特定代码区域执行的输…

Angr_ctf

Angr_ctf:1~13练习 文章目录 Angr_ctf:1~13练习#、angr 入门00_angr_find(1)总结(2)练习 01_angr_avoid(1)总结(2)练习 02_angr_condition(1&…

Angr CTF 从入门到入门(1)

angr是一个很厉害的二进制分析工具,能够实现很多自动化的逆向工作。最近正在学习,在看文档的时候发现了有个angrCTF的实战可以练习angr。 angrCTF:http://angr.oregonctf.org/ angr文档:https://docs.angr.io/ 这篇文章会是这个系列的第一篇文…

angr的windows安装——萌新

window10中符号执行(angr)的安装——小白篇 最近做题的时候遇到了一些需要使用angr来完成的题目,之后在网上搜了好久发现大多是Linux以及其它系统的angr安装教程。windows系统的安装方法几乎没有。身为一个萌新,猜测同类们应该也会…

Angr 安装

1、安装必要的软件环境 sudo apt-get install python3-dev libffi-dev build-essential virtualenvwrapper 2、开始正式安装angr mkvirtualenv --python$(which python3) angr && pip install angr 3、遇到 mkvirtualenv: command not found 问题 在终端执行以下命…

Angr 01 avoid 忽略的条件

01_angr_avoid无法反编译主函数,模块比较多,加上avoid过滤条件之后,就没那么慢了。 import angr …

图解angr中两种CFG的区别

angr里提供两种CFG的生成,一种是CFGFast,一种是CFGEmulated。这两种究竟有什么不同呢? 本文主要是用图来说明下这个问题。可能回答的不是很完整。 CFGFast这种CFG生成的比较快,但是没有考虑上下文关系。比如函数A调用了printf函…

Angr 02_angr_find_condition 根据输出状态条件搜索正确输入

explore的find和avoid支持函数作为参数,根据函数返回值来判断是否成功。Angr把状态传入了函数,从而判断成功与否。 import angr import sysdef main(argv):path_to_binary argv[1]project angr.Project(path_to_binary)initial_state project.factor…

angr的安装

ubuntu要先安装pip,ANGR官方给出的为pip命令pip install angr; 就算将pip改为apt-get 也不行。 借鉴Ubuntu安装pip的安装方式,安装pip,然后运行pip install angr,结束。 angr安装完后,要安装图形生成插件…

angr 学习笔记

附件,参考1,参考2 符号执行原理 基本概念 即初始参数用变量代替,模拟程序执行过程,维护执行到各个位置时的状态(用各个变量之间的代数关系表示)。 符号状态(Symbolic State) 当前…

利用angr获取CFG

静态二进制分析中,对于程序控制流图CFG的计算是很基础且重要的一步,很多的分析是要建立在CFG的基础上。angr作为二进制分析工具,当然提供了CFG功能,下面我们就来探索下要如何使用angr计算CFG,以及其中的坑。 angr中的…

Angr 内存符号化 05_angr_symbolic_memory

说明 通过查看下面的源码或IDA汇编&#xff0c;可知此例需要输入4个输入字符串&#xff0c;给每个输入字符串赋值给了user_input数组这块已经开辟的内存空间&#xff0c;我们可以监测user_input在内存中的值来获取最终的答案。 随机生成的源码 #include <stdio.h> #in…

Angr学习笔记

Angr学习笔记 前言 本文记录一下Angr的基本使用方法&#xff0c;主要是基于Github上的开源项目以及笔记AngrCTF_FITM整理&#xff0c;Angr在逆向方面确实用处比较大&#xff0c;特此记录一下。 什么是Angr angr是一个用于分析二进制文件的python框架。它专注于静态和符号分…

angr纠错和易错点

现在环境已经没有问题了。我运行了几个代码&#xff08;使用python3&#xff09;&#xff0c;都会出现不同的问题。 运行报错 解决方法&#xff1a; 添加b 运行报错&#xff1a; 解决方法&#xff1a; 删掉cast_to; 因为python2中str就是字节流 python3中不一样&#xff0c…

git本地分支管理

文章目录 一、master分支没有改变&#xff0c;合并其他分支二、master分支有改变&#xff0c;合并其他分支 作为开发人员&#xff0c;我们应该尽可能多地建立分支&#xff0c;在分支上进行开发&#xff0c;功能测试稳定后&#xff0c;再将分支上地代码合并到指定的分支 git bra…

Git 分支管理

Git 分支管理 一、主分支Master 首先&#xff0c;代码库应该有一个、且仅有一个主分支。所有提供给用户使用的正式版本&#xff0c;都在这个主分支上发布。 Git主分支的名字&#xff0c;默认叫做Master。它是自动建立的&#xff0c;版本库初始化以后&#xff0c;默认就是在主分…

git分支管理策略

git分支管理策略 1 总览 git 的分支整体预览图如下&#xff1a; 从上图可以看到主要包含下面几个分支&#xff1a; master&#xff1a;git默认主分支&#xff08;这里不作操作&#xff09;。 stable&#xff1a;稳定分支&#xff0c;替代master&#xff0c;主要用来版本发布。…

IDEA中使用Git功能和IDEA中的Git分支管理

IDEA中使用Git功能 IDEA中创建Git仓库 1、设置Git程序的路径 2、设置编译器的GitHub账号 3、新建项目 4、发布项目到GitHub IDEA向Git提交修改后的代码 1、实现git add 2、开始commit 3、实现git commit -m 4、实现git push origin master 项目成员使用IDEA的Git功…