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

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

那么本文就介绍一下这个功能点

条件断点

什么是条件断点呢?

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

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

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

初次分析

main函数

flag的格式

图片

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

图片

继续分析

图片

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

密文:

图片

cry1

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

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

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

图片

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

图片

初次分析到此结束

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.mzph.cn/news/721464.shtml

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

相关文章

Premiere Pro 2024:革新视频编辑,打造专业影视新纪元

在数字化时代,视频已经成为人们获取信息、娱乐消遣的重要媒介。对于视频制作者而言,拥有一款功能强大、易于操作的视频编辑软件至关重要。Premiere Pro 2024,作为Adobe旗下的旗舰视频编辑软件,凭借其卓越的性能和创新的特性&#…

Java 解决异步 @Async 失效问题

1.问题描述 使用Async进行异步处理时,异步没有生效 2.原因分析 经过排查后发现是因为使用Async的方法没有跨2个Service导致的 错误示例 控制器接口 > 直接调用 custAdminService.importCBuy() 3.解决方案 Controller接口不变,多添加一层Service&a…

基于机器学习的曲面拟合方法

随着科技的不断发展,机器学习成为了最近最热门的技术之一,也被广泛应用于各个领域。其中,基于机器学习的曲面拟合方法也备受研究者们的关注。曲面拟合是三维模型处理中的重要技术,其目的是用一组数据点拟合出平滑的曲面&#xff0…

Spring框架学习

Spring: (1)Bean线程安全问题 (2)AOP,事务原理,事务失败 (3)Bean的生命周期 (4)循环依赖 SpringMVC: (1&#xff09…

5201B数据网络测试仪

|5201B数据网络测试仪| | 产品综述 | 电科思仪5201B便携式数据网络测试仪,集成高性能IP基础测试硬件平台,提供L2-L3流量测试及协议仿真解决方案,支持以太网报文线速生成与分析、统计、报文捕获,以及路由、接入、组播、数据中心等协…

基于深度学习的烟雾检测系统(含UI界面、yolov8、Python代码、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下: 算法模型:     yolov8 yolov8主要包含以下几种创新:         1. 添加注意力机制(SE、CBAM等)         2. 修改可变形卷积(DySnake-主干c…

(学习日记)2024.03.04:UCOSIII第六节:main函数+前六节总结

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

符号函数Sign(博途PLC SCL代码)

符号函数在ADRC自抗扰算法里会有涉及,同时在滑膜控制里也会用到,这篇博客我们介绍符号函数在博途PLC里的实现。 1、ADRC自抗扰算法: https://rxxw-control.blog.csdn.net/article/details/126547180https://rxxw-control.blog.csdn.net/article/details/1265471802、模拟量…

视频生成模型Sora的全面解析:从AI绘画、ViT到ViViT、DiT、VDT、NaViT、VideoPoet

视频生成模型Sora的全面解析:从AI绘画、ViT到ViViT、DiT、VDT、NaViT、VideoPoet 真没想到,举例视频生成上一轮的集中爆发才过去三个月,没想OpenAI一出手,该领域又直接变天了自打2.16日OpenAI发布sora以来,不但把同时…

软考58-上午题-【数据库】-分布式数据库

一、四个透明 二、四种性质 三、真题 真题1: 真题2: 真题3: 真题4: 真题5:

5G智能制造纺织工厂数字孪生可视化平台,推进纺织行业数字化转型

5G智能制造纺织工厂数字孪生可视化平台,推进纺织行业数字化转型。纺织工业作为传统制造业的重要组成部分,面临着转型升级的紧迫需求。随着5G技术的快速发展,智能制造成为纺织工业转型升级的重要方向。数字孪生可视化平台作为智能制造的核心技…

力扣76. 最小覆盖子串(滑动窗口)

Problem: 76. 最小覆盖子串 文章目录 题目描述思路复杂度Code 题目描述 思路 1.定义两个map集合need和window(以字符作为键,对应字符出现的个数作为值),将子串t存入need中; 2.定义左右指针left、right均指向0&#xff…

【AI视野·今日Sound 声学论文速览 第五十期】Fri, 1 Mar 2024

AI视野今日CS.Sound 声学论文速览 Fri, 1 Mar 2024 Totally 9 papers 👉上期速览✈更多精彩请移步主页 Daily Sound Papers Probing the Information Encoded in Neural-based Acoustic Models of Automatic Speech Recognition Systems Authors Quentin Raymondau…

Git分布式管理-头歌实验本地版本库

一、本地版本库创建 任务描述 本地Git操作三部曲是“修改-添加-提交”,即先要在本地仓库进行添加、删除或编辑等修改,然后将本地所做的修改添加至暂存区。添加至暂存区的这些本地修改,并未提交到本地仓库,需要执行提交命令才能将暂…

CAN通信篇 - CanTrcv模块配置(二)

文章目录 CanTrcvConfigSetCanTrcvChannelCanTrcvDioChannelAccess 总结 CanTrcv模块配置也比较简单,主要是配置CanTrcv的行为。有一些工程甚至没有包含CanTrcv配置模块(CanTrcv配置代码已通过手写代码方式嵌入工程)。下图所示为CanTrcv模块配置容器。 CanTrcvConfi…

实名制交友-智能匹配-仿二狗交友系统-TP6+uni-APP小程序H5公众号-源码交付-支持二开!

一、代码风格 通常不同的开发者具备不同的代码风格,但为了保证语音交友系统开发质量,在编码前需要进行代码风格的统一,通过制定一定的规则,约束开发者的行为。具有统一风格的代码才能更清晰、更完整、更容易理解、更方便后期维护…

09 Qt扩展LineEdit组件:Input输入框

系列文章目录 01 Qt自定义风格控件的基本原则-CSDN博客 02 从QLabel聊起:自定义控件扩展-图片控件-CSDN博客 03 从QLabel聊起:自定义控件扩展-文本控件-CSDN博客 04 自定义Button组件:令人抓狂的QToolButton文本图标居中问题-CSDN博客 0…

Mysql80服务无法启动请输入Net helpMsg3534以获得更多的帮助

起因&情景: 朋友正在操作数据库,然后电脑突然死机,再重启电脑后启动数据库服务报: 然后朋友尝试各种操作都没有办法正常启动, 一、网上解决方案:(先别操作) 1 删掉&#xff1a…

爬取博客的图片并且将它存储到响应的目录

目录 前言 思想 注意 不多说解释了,贴代码吧 config.json Get_blog_img.py 把之前的写的代码也贴上 Get_blog_id.py 主函数 main.py 运行结果 前言 在上一篇博客中我们介绍了如何爬取博客链接 利用python爬取本站的所有博客链接-CSDN博客文章浏览阅读74…

MatteFormer:Transformer-based image matting via prior-tokens

【CVPR2022】MatteFormer: Transformer-Based Image Matting via Prior-Tokens-CSDN博客文章浏览阅读1.2k次。【CVPR2022】 MatteFormer: Transformer-Based Image Matting via Prior-Tokens_matteformerhttps://blog.csdn.net/Thinkobj/article/details/128209388本文核心2点&…