Angr 内存符号化 05_angr_symbolic_memory

article/2025/11/8 10:27:40

说明

通过查看下面的源码或IDA汇编,可知此例需要输入4个输入字符串,给每个输入字符串赋值给了user_input数组这块已经开辟的内存空间,我们可以监测user_input在内存中的值来获取最终的答案。

随机生成的源码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define USERDEF "YZJGNZSQCRTECQLVJKDHBYEFALOWJXHE"char padding0[ 59499168 ];
char user_input[32+1];
char padding1[ 21264468 ];char msg[] = "placeholder\n";void print_msg() {printf("%s", msg);
}int complex_function(int value, int i) {
#define LAMBDA 9if (!('A' <= value && value <= 'Z')) {printf("Try again.\n");exit(1);}return ((value - 'A' + (LAMBDA * i)) % ('Z' - 'A' + 1)) + 'A';
}int main(int argc, char* argv[]) {memset(user_input, 0, sizeof(user_input));//print_msg();printf("Enter the password: ");scanf("%8s %8s %8s %8s", user_input, &user_input[8], &user_input[16], &user_input[24]);for (int i=0; i<32; ++i) {user_input[i] = (char) complex_function(user_input[i], i);}if (strncmp(user_input, USERDEF, 32)) {printf("Try again.\n");} else {printf("Good Job.\n");}
}

IDA查看地址

1
scanf的8s表示字符串长度为8,每个字符2个字节,一共8*2*4=64个字节。

pwndbg查看内存数据

1

这里测试用的输入字符串是:aaaaaaaa bbbbbbbb cccccccc dddddddd,一共32个字符,每个字符2字节,一共64字节。
每个字符串包含8个字符,每个字符8位,所以设置BVS时,第2个参数为8*8=64

Angr exp

import angr
import claripy
import sysdef main(argv):path_to_binary = argv[1]project = angr.Project(path_to_binary)start_address = 0x08048601initial_state = project.factory.blank_state(addr=start_address)# The binary is calling scanf("%8s %8s %8s %8s").# (!)password0 = claripy.BVS('password0', 64)password1 = claripy.BVS('password1', 64)password2 = claripy.BVS('password2', 64)password3 = claripy.BVS('password3', 64)# Determine the address of the global variable to which scanf writes the user# input. The function 'initial_state.memory.store(address, value)' will write# 'value' (a bitvector) to 'address' (a memory location, as an integer.) The# 'address' parameter can also be a bitvector (and can be symbolic!).# (!)password0_address = 0x0A1BA1C0initial_state.memory.store(password0_address, password0)password1_address = 0x0A1BA1C8initial_state.memory.store(password1_address, password1)password2_address = 0x0A1BA1D0initial_state.memory.store(password2_address, password2)password3_address = 0x0A1BA1D8initial_state.memory.store(password3_address, password3)simulation = 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]# Solve for the symbolic values. We are trying to solve for a string.# Therefore, we will use eval, with named parameter cast_to=str# which returns a string instead of an integer.# (!)solution0 = solution_state.solver.eval(password0,cast_to=bytes).decode('utf-8')solution1 = solution_state.solver.eval(password1,cast_to=bytes).decode('utf-8')solution2 = solution_state.solver.eval(password2, cast_to=bytes).decode('utf-8')solution3 = solution_state.solver.eval(password3, cast_to=bytes).decode('utf-8')solution = "Solution:{} {} {} {}".format(solution0, solution1, solution2, solution3)print(solution)else:raise Exception('Could not find the solution')if __name__ == '__main__':main(sys.argv)

结果

1


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

相关文章

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功…

【Git-10】Eclipse中Git分支管理

分支管理&#xff0c;是 Git 开发中的一个非常有效的团队开发策略。多个程序员并行开发&#xff0c;每个程序员可以定义各自的分支&#xff0c;在自己的分支上开发工程。再开发结束测试完毕后&#xff0c;再合并到主干工程中&#xff0c;一次性提交到远程。由其他程序员使用。 …

Git 分支管理最佳实践

Git 是目前最流行的源代码管理工具。大量的软件项目由 GitHub、Bitbucket 和 GitLab 这样的云服务平台或是私有的 Git 仓库来管理。在使用 Git 时通常会遇到的一个问题是采用何种分支管理实践&#xff0c;即如何管理仓库中作用不同的各类分支。和软件开发中的其他实践一样&…

Git分支管理办法,每个团队不一样,仅供参考!

原创不易&#xff0c;转载注明出处&#xff0c;喜欢就点个赞吧&#xff01; 网上有很多文章&#xff0c;很少有实际具体的流程图说明&#xff0c;我根据我们团队的情况&#xff0c;画了几张简图&#xff0c;仅供参考。 每个公司的代码管理方式都不一样 主要有两种 1.TrunkB…

Git分支管理与常用命令

一、分支管理 Git在创建分支仅是生成了一个指针又称快照&#xff08;有的工具则进行了物理拷贝&#xff09;&#xff0c;这样在使用起来就非常的方便。方便的同时问题随之而来&#xff0c;如果不加管理&#xff0c;那么就会到处开枝散叶&#xff0c;完全看不出主干。因此&…

复杂项目的版本管理及git分支管理建议

在复杂项目中&#xff0c;特别是多团队的快速迭代中&#xff0c;版本管理与分支管理&#xff0c;总是我们难以回避的问题&#xff0c;这里分享一下我们在团队中使用的规范&#xff0c;以及对应的每一步的步骤。 为什么需要GIT使用建议 团队开发中&#xff0c;遵循一个合理、清…

2022新版Git教程 从入门到实战(三)Git分支管理

&#x1f41f; 个人主页 &#xff1a;https://blog.csdn.net/qq_52007481⭐个人社区&#xff1a;【小鱼干爱编程】&#x1f4f0;最近专栏&#xff1a;Git教程专栏 文章目录 分支工作的工作流程Git分支管理分支的好处 前期准备查看分支分支创建分支转换在新分支中添加记录切换回…

Git 分支管理最佳实践(转载)

前言 Git 是目前最流行的源代码管理工具。大量的软件项目由 GitHub、Bitbucket 和 GitLab 这样的云服务平台或是私有的 Git 仓库来管理。在使用 Git 时通常会遇到的一个问题是采用何种分支管理实践&#xff0c;即如何管理仓库中作用不同的各类分支。和软件开发中的其他实践一样…

Git 分支管理策略汇总

原文链接&#xff1a; Git 分支管理策略 最近&#xff0c;团队新入职了一些小伙伴&#xff0c;在开发过程中&#xff0c;他们问我 Git 分支是如何管理的&#xff0c;以及应该怎么提交代码&#xff1f; 我大概说了一些规则&#xff0c;但仔细想来&#xff0c;好像也并没有形成…

Git分支管理

四、分支管理 分支的存在&#xff0c;极大的强化了不同开发者的协作管理&#xff0c;在一个功能的开发过程中&#xff0c;可以在一个单独的分支上完成&#xff0c;这样不影响主分支的开发&#xff0c;待功能完成后再将分支的内容合并到主分支。 每次提交到分支&#xff0c;Gi…

git的分支管理

这篇文章主要想讲一下git下的分支管理&#xff0c;因为分支管理是你在日常工作中必不可少的一项操作&#xff0c;觉得自己之前了解的不是很多&#xff0c;这次便决定利用一些细碎的时间好好去再次学习巩固一下&#xff0c;初衷也是为了加深自己的理解&#xff0c;便写下此文&am…

【Git】“分支” 如何管理和使用?这一篇就够了~

目录 一、什么是分支&#xff1f; 二、分支的操作 2.1、查看分支 2.2、创建分支 2.3、切换分支 和 修改分支 2.4、合并分支 2.4.1、正常合并 2.4.2、合并冲突 三、创建分支和切换分支的底层原理 一、什么是分支&#xff1f; 在版本控制中&#xff0c;我们可以针对每个任…

管理Git的分支

目录 一、本地分支&#xff08;local branches&#xff09;管理 1.1 查看和建立分支&#xff08; git branch&#xff09; 1.2 分支中提交的浏览与比较&#xff08;git log&#xff09; 1.3 切换当前分支&#xff08;git switch&#xff09;与合并分支&#xff08;git mer…

常用的git分支管理方法都在这了

一、分支管理定义 几乎每一种版本控制系统都以某种形式支持分支&#xff0c;一个分支代表一条独立的开发线&#xff0c;使用分支意味着你可以从开发主线上分离开来&#xff0c;然后在不影响主线的同时继续工作&#xff0c;Git 分支实际上是指向更改快照的指针。 其作用显然…

前端安全之xss与xsrf

提到前端安全&#xff0c;往往离不开xss(跨站脚本攻击)、xsrf(跨站伪造请求)&#xff0c;在此记录一下关于前端安全的学习过程。 什么是xss&#xff1f; 跨站脚本攻击(Cross Site Scripting)&#xff0c;为了不和css(层叠样式表)混淆&#xff0c;故记为xss。其原理是利用用户…