企业网站建设一般考虑哪些因素,免费项目发布平台,常用python编程软件,在线代理ip不知道你是否使用过IDA的条件断点呢#xff1f;在IDA进阶使用中#xff0c;它的很多功能都有大作用#xff0c;比如#xff1a;ida-trace来跟踪调用流程。同时IDA的断点功能也十分强大#xff0c;配合IDA-python的输出语句能够大杀特杀#xff01;
那么本文就介绍一下这…不知道你是否使用过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网安经典常用工具包 ③ 100SRC分析报告 ④ 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(outputrax ,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*1x2*5x3*4x4*30x436y1*1y2*5y3*4y4*30x2B4z1*1z2*5z3*4z4*30x2AFn1*1n2*5n3*4n4*30x312x1*2x2*1x3*2x4*30x2EAy1*2y2*1y3*2y4*30x253z1*2z2*1z3*2z4*30x20An1*2n2*1n3*2n4*30x28Ex1*2x2x3x40x1c6y1*2y2y3y40x15cz1*2z2z3z40x17cn1*2n2n3n40x17ax1*3x2*5x3*4x4*70x69ey1*3y2*5y3*4y4*70x4aez1*3z2*5z3*4z4*70x4b1n1*3n2*5n3*4n4*70x522z3解密
解密脚本 Python from z3 import *# 定义变量x [Int(fx{i}) for i in range(1, 5)]y [Int(fy{i}) for i in range(1, 5)]z [Int(fz{i}) for i in range(1, 5)]n [Int(fn{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(fx{i} {model[x[i-1]]})print(fy{i} {model[y[i-1]]})print(fz{i} {model[z[i-1]]})print(fn{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以SnK开头所以找到了真正的flag
但是顺序发生了变化下面是假flag生成密文解密之后的结果发现密文变化了
±---------------------------------------------------------------------- | Snku2r3cd3__era | | Snk78906ba15432 | | | | Snk0123456789ab | | | | 经过交换后的结果 | | | | Snk78906ba15432 | | | | 按照我们构造的flag交换顺序后的字符串来恢复 | | 恢复 | | Snk3_are_cu2r3 | ±---------------------------------------------------------------------- 成功验证