矩阵爆破逆向之条件断点的妙用

不知道你是否使用过IDA的条件断点呢?在IDA进阶使用中,它的很多功能都有大作用,比如:ida-trace来跟踪调用流程。同时IDA的断点功能也十分强大,配合IDA-python的输出语句能够大杀特杀!

那么本文就介绍一下这个功能点,使用z3来秒解题目。

条件断点

什么是条件断点呢?

条件断点(Conditional
Breakpoint)是一种在代码调试过程中设置的断点,它可以根据特定的条件暂停程序的执行。当程序执行到设置了条件断点的代码行时,如果该条件为真,则程序会暂停执行;如果该条件为假,则程序会继续执行。这种调试技术常用于复杂的程序调试,能够帮助程序员更快地发现程序中的错误,并提高调试的效率。条件断点可以应用于多种编程语言和开发环境中,如C++、Java、Python等。

与普通的断点大差不差,不同点在于,程序运行到条件断点处时,不会让程序暂停,而是继续执行,并执行我们设置好的脚本。

OK,接下来让我们分析这道题目

初次分析

main函数

flag的格式

打开main函数,发现使用了SIMD指令赋值了一些关键数据

继续分析

看来cry1和cry2是很关键的函数

密文:

cry1

发现对我们的输入flag,进行一些转换:

比如:位置顺序和对我们的flag异或一个固定的值。

异或的值是由上下文决定的,但是总是单字节固定

将输入的flag运算完后,转换为 一个int类型的矩阵

初次分析到此结束

帮助网安学习,全套资料S信免费领取:
① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)

cry2

条件断点妙用

经过动调,我发现关键的加密就这三个汇编指令。

意思:取flag->与一个固定的矩阵相乘->输出加密之后的矩阵

如果我们能够打印,加密前的flag和相乘的矩阵元素,就可以逆推明文啦

主要是不清楚,矩阵相乘的顺序,可能是打乱的,那样只能这样来做。

使用了:条件断点

这三个断点依次使用下面3个条件输出

主要是这两个命令:

get_reg_value(“rbx”) 获取rbx寄存器的值

idc.get_wide_dword() 获取某地址的值(4字节读取)


  print("[rbx] = ",hex(idc.get_wide_dword(get_reg_value("rbx"))))print("rax = ",hex(get_reg_value("rax")),"[rdi]=",hex(idc.get_wide_dword(get_reg_value("rdi"))))print("output,rax = ",hex(get_reg_value("rax")),"n")

然后edit breakpoint

OK,见证奇迹的时刻到了,运行程序,成功输出:

推导

因为密文说16字节的,我们将真正的密文提取出来和我们输入假flag产生的密文也提取出来,进行对比


Python

 密文unsigned int data[16] = {0x00000436, 0x000002B4, 0x000002AF, 0x00000312, 0x000002EA, 0x00000253,0x0000020A, 0x0000028E,0x000001C6, 0x0000015C, 0x0000017C, 0x0000017A, 0x0000069E, 0x000004AE,0x000004B1, 0x00000522};假flag输出的结果密文unsigned int data[16] = {0x00000466, 0x000002F9, 0x00000329, 0x0000046E, 0x00000290, 0x00000184,0x000001E4, 0x0000023A,0x00000183, 0x000000C1, 0x0000011E, 0x00000122, 0x00000646, 0x00000467,0x000004F7, 0x000005EA};这是根据条件输出得到的规律;x1*1+x2*5+x3*4+x4*3=0x436y1*1+y2*5+y3*4+y4*3=0x2B4z1*1+z2*5+z3*4+z4*3=0x2AFn1*1+n2*5+n3*4+n4*3=0x312x1*2+x2*1+x3*2+x4*3=0x2EAy1*2+y2*1+y3*2+y4*3=0x253z1*2+z2*1+z3*2+z4*3=0x20An1*2+n2*1+n3*2+n4*3=0x28Ex1*2+x2+x3+x4=0x1c6y1*2+y2+y3+y4=0x15cz1*2+z2+z3+z4=0x17cn1*2+n2+n3+n4=0x17ax1*3+x2*5+x3*4+x4*7=0x69ey1*3+y2*5+y3*4+y4*7=0x4aez1*3+z2*5+z3*4+z4*7=0x4b1n1*3+n2*5+n3*4+n4*7=0x522

z3解密

解密脚本:


Python

 from z3 import *# 定义变量x = [Int(f'x{i}') for i in range(1, 5)]y = [Int(f'y{i}') for i in range(1, 5)]z = [Int(f'z{i}') for i in range(1, 5)]n = [Int(f'n{i}') for i in range(1, 5)]# 定义目标值goal = [0x466,0x2f9,0x329,0x46e,0x290,0x184,0x1e4,0x23a,0x183,0xc1,0x11e,0x122,0x646,0x467,0x4f7,0x5ea]# 定义约束条件constraints = [x[0]*1 + x[1]*5 + x[2]*4 + x[3]*3 == goal[0],y[0]*1 + y[1]*5 + y[2]*4 + y[3]*3 == goal[1],z[0]*1 + z[1]*5 + z[2]*4 + z[3]*3 == goal[2],n[0]*1 + n[1]*5 + n[2]*4 + n[3]*3 == goal[3],x[0]*2 + x[1]*1 + x[2]*2 + x[3]*3 == goal[4],y[0]*2 + y[1]*1 + y[2]*2 + y[3]*3 == goal[5],z[0]*2 + z[1]*1 + z[2]*2 + z[3]*3 == goal[6],n[0]*2 + n[1]*1 + n[2]*2 + n[3]*3 == goal[7],x[0]*2 + x[1] + x[2] + x[3] == goal[8],y[0]*2 + y[1] + y[2] + y[3] == goal[9],z[0]*2 + z[1] + z[2] + z[3] == goal[10],n[0]*2 + n[1] + n[2] + n[3] == goal[11],x[0]*3 + x[1]*5 + x[2]*4 + x[3]*7 == goal[12],y[0]*3 + y[1]*5 + y[2]*4 + y[3]*7 == goal[13],z[0]*3 + z[1]*5 + z[2]*4 + z[3]*7 == goal[14],n[0]*3 + n[1]*5 + n[2]*4 + n[3]*7 == goal[15]]# 创建求解器solver = Solver()# 添加约束条件solver.add(constraints)# 求解if solver.check() == sat:model = solver.model()for i in range(1, 5):print(f'x{i} = {model[x[i-1]]}')print(f'y{i} = {model[y[i-1]]}')print(f'z{i} = {model[z[i-1]]}')print(f'n{i} = {model[n[i-1]]}')else:print('无解')

得到的结果,将其按照数组来填充

得到


Python

这是真flag解密后的结果:x1 = 100y1 = 89z1 = 119n1 = 92x2 = 66y2 = 5z2 = 69n2 = 4x3 = 84y3 = 83z3 = 4n3 = 104x4 = 104y4 = 82z4 = 69n4 = 86100,89,119,92,66,5,69,4,84,83,4,104,104,82,69,86

这是假flag解密后的结果:

x1 = 60y1 = 1z1 = 47n1 = 4x2 = 88y2 = 87z2 = 86n2 = 95x3 = 89y3 = 13z3 = 14n3 = 94x4 = 90y4 = 91z4 = 92n4 = 9360,1,47,4,88,87,86,95,89,13,14,94,90,91,92,93

按照我的思路来填充结果数组;

因为刚才说了,异或的值不清楚,但是一直为单字节固定值,所以使用Cybe的爆破功能。

根据程序的验证功能可知,flag以Sn@K开头,所以找到了真正的flag

但是顺序发生了变化,下面是假flag生成密文解密之后的结果,发现密文变化了

±----------------------------------------------------------------------+
| Sn@ku2r3cd3__era |
| Sn@k78906ba15432 |
| |
| Sn@k0123456789ab |
| |
| 经过交换后的结果: |
| |
| Sn@k78906ba15432 |
| |
| 按照我们构造的flag交换顺序后的字符串来恢复 |
| 恢复 |
| Sn@k3_are_cu2r3 |
±----------------------------------------------------------------------+

成功验证!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/502851.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis的基本数据类型(一)

redis的基本数据类型 1、redis1.1、数据库分类1.2、NoSQL分类1.3、redis简介1.4、redis应用1.5、如何学习redis 2、redis的安装2.1、Windows安装2.2.1、客户端redis管理工具 2.2、Linux安装🔥2.2.1、redis核心文件2.2.2、启动方式2.2.3、redis桌面客户端1、redis命令…

Bored Ape Yacht Club NFT 概览与数据分析

作者:stellafootprint.network 编译:cicifootprint.network 数据源:Bored Ape Yacht Club NFT Collection Dashboard Bored Ape Yacht Club 是 Ethereum 区块链上独特的 10,000 个 Bored Ape NFT 的独家收藏。这个 NFT 项目会在 2024 年…

wy的leetcode刷题记录_Day79

wy的leetcode刷题记录_Day79 声明 本文章的所有题目信息都来源于leetcode 如有侵权请联系我删掉! 时间:2024-3-1 前言 目录 wy的leetcode刷题记录_Day79声明前言2369. 检查数组是否存在有效划分题目介绍思路代码收获 61. 旋转链表题目介绍思路代码收获 82. 删除排…

网络编程第二天

1.基于TCP的通信(面向连接的通信) 服务器代码实现&#xff1a; #include <myhead.h> #define IP "192.168.126.91" #define PORT 9999 int main(int argc, const char *argv[]) {//1、创建套接字int sfd-1;if((sfdsocket(AF_INET,SOCK_STREAM,0))-1){perror(…

设计模式——2_3 迭代器(Iterator)

生活就像一颗巧克力&#xff0c;你永远不知道下一颗是什么味道 ——《阿甘正传》 文章目录 定义图纸一个例子&#xff1a;假如你的采集器供应商提供了不同类型的返回值单独的遍历流程实现 碎碎念如果读写同时进行会发生啥&#xff1f;外部迭代和内部迭代迭代器和其他模式迭代器…

List 集合遍历过程中删除元素避坑指南。

文章目录 1. 遍历2. 遍历过程中删除元素2.1 for 简单循环正向遍历方式2.2 for 简单循环反向遍历方式2.3 foreach 方式遍历删除2.4 Iterator的remove()方法2.5 <font color green> removeIf() &#xff08;推荐&#xff09;<green>2.6 Strem 方式 作为一名后端开发…

http状态,cookie、session、token的对比

http是无状态的&#xff0c;也就是说断开会话了服务器就不记得任何事情了&#xff0c;但这样对于用户会很麻烦&#xff0c;因为要不停输入用户名和密码 cookie是放在浏览器里的数据&#xff0c;第一次访问后服务器会set cookie&#xff0c;然后浏览器保存这个cookie&#xff0…

自动化测试实例—Web登录功能性测试(无验证码)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是自动化测试 把人为驱动的测试行为转化为机器执行的一…

总结一下linux性能检测和调优手段

1.perf 是 Linux 系统中性能分析工具&#xff0c;用于收集性能相关的信息。它可以用于查看 CPU 使用情况、内存性能、磁盘 I/O 等&#xff0c;以帮助开发者找到性能瓶颈。 以下是一些 perf 常见用法和示例&#xff1a; 1. CPU Profiling a. 查看 CPU 使用率 perf stat -e cpu…

大数据职业技术培训包含哪些

技能提升认证考试&#xff0c;旨在通过优化整合涵盖学历教育、职业资格、技术水平和高新技术培训等各种教育培训资源&#xff0c;通过大数据行业政府引导&#xff0c;推进教育培训的社会化&#xff0c;开辟教育培训新途径&#xff0c;围绕大数据技术人才创新能力建设&#xff0…

百度交出2023年业绩答卷:全力提速AI布局,注入业绩增长新动能

2月28日&#xff0c;百度集团&#xff08;HK:09888、NASDAQ:BIDU&#xff0c;下称“百度”&#xff09;发布2023年第四季度及全年财报&#xff0c;交出了一份营收与利润双双跃升的答卷&#xff0c;展现出百度在巩固原有业绩护城河的基础上&#xff0c;投入AI大模型后释放出的巨…

vue2后台管理系统demo,包含增删查改、模糊搜索、分页

因一直敲小程序&#xff0c;vue不熟练&#xff0c;自己练手项目&#xff0c;就包含增删查改以及模糊搜索分页 一、页面简单但功能齐全 二、数据是mock模拟 三、启动步骤 1、 json-server --watch data.json 启动mock数据 2、npm i 下载依赖 3、npm run serve 四、github地址…