首页 > 其他分享 >BUUCTF-Dig the way

BUUCTF-Dig the way

时间:2024-01-27 12:44:08浏览次数:22  
标签:BUUCTF 字节 v10 Dig a1 abs way v7 v8

无壳,拖进 ida 看一下(下图为已经分析过的)

大概看一下整体的逻辑就是,从 data 文件中读入数据存入 Str,后续对 v7 数组调用 v11 处的三个 func 进行一系列操作后,再调用 get_key 函数计算 flag,调用此函数的条件为 v8 为 0。接下来就具体分析一下吧。

首先是三个 func,看看他们都干了啥

  • func0

很明显就是交接换两个数

  • func1

没什么好说的,就是返回 abs(a1[a2] + a1[a3]) - abs(a1[a3]) - abs(a1[a2]) + 2 的值

  • func2

返回 abs(a1[a3]) - abs(a1[a3] + a1[a2]) + abs(a1[a2]) + 2 的值,依旧对两个数进行一系列绝对值操作,容易看出此函数返回值必定大于等于 2

接下来就是获取 flag 前的操作,直接跳过非重点部分分析一下重点,即下图部分

i 从 0 开始,计数器 cntt 从 1 开始,while 循环中内容共执行三次,三次依次调用 func0,func1,func2,三个函数对 v7[v9],v7[v10] 进行操作,返回值依次填入 v7[1],v7[2],v7[3]。详细情况见上图注释。

最终对执行 get_key 函数起决定作用的是 v8 的值,v8 初始值为 3,但是并没有明显的对 v8 数值起到影响的操作,观察一下循环中对于 v7 数组的操作,第三次操作对 v7[3] 进行了赋值,但是 v7[3] 并没有出现在定义中,观察数据地址(见下图),简单处理分析后发现 v7[3] 即是 v8

但是问题来了,func2 的返回值根据之前的分析恒大于等于2,不可能取到符合条件的 0,不知道咋办了嘻嘻,搜了一下 wp 醍醐灌顶 orz

func2 的返回值虽不可以取到 0,但是 func1 的返回值是可以取 0 的,所以可以利用第一次循环中的 func0 函数将 func1 与 func2 进行一次对换,使最终赋值 v7[3] 即 v8 的为 func2 的返回值即 0。

结合先前分析的数据地址(上图),func1 即 v11[1] 可以表示为 v7[7],func2 即 v11[2] 可以表示为 v7[8],所以第一次 while 循环中,v9 应当为 7, v10 应当为 8,这样就可以实现两个函数的交换了。

这样,while 循环中执行过程如下:

1、 i = 0, cntt = 1, v9 = 7, v10 = 8, v7[1] = swap(v7[7], v7[8]) = 1
2、 i = 1, cntt = 2, v9 = 1, v10 = 2, v7[2] = abs(v7[1]) + abs(v7[2]) - abs(v7[1] + v7[2]) + 2 = 1 + 2 - (1 + 2) + 2 = 2
3、 i = 2, cntt = 3, v9 = 2, v10 = 3, v7[3] = abs(v7[2] + v7[3]) - abs(v7[2]) - abs(v7[3]) + 2 = abs(2 + v7[3]) - 2 - abs(v7[3]) + 2= 0,所以 v7[3] 即 v8 初始取 -1 就可以使终值 = 0

因此,构造的 data 文件中,需要赋初值的有 v8 = -1,v9 = 7,v10 = 8

具体该如何构造呢,看到输入部分

读取 data 文件中内容后存入了 Str,结合之前分析的数据地址

Str 占 20 个字节,后续每个数据占 4 字节

db 定义字节类型变量,一个字节数据占 1 个字节单元
dw 定义字类型变量,一个字数据占 2 个字节单元
dd 定义双字类型变量,一个双字数据占 4 个字节单元

计算得到 v8 起始位置为 32 字节处,占 4 个字节,-1 可以表示为 FF FF FF FF,v9、v10以此类推,winhex 创造以下文件并赋值

移到文件夹中运行程序,得到 flag{8cda1bdb68a72a392a3968a71bdb8cda}

标签:BUUCTF,字节,v10,Dig,a1,abs,way,v7,v8
From: https://www.cnblogs.com/Moomin/p/17990843

相关文章

  • BUUCTF Reverse easyre wp
    使用exeinfo工具查看文件信息使用IDA64位打开文件,再使用Shift+F12打开字符串窗口,发现flag字符串双击跳转到字符串在汇编代码中的存储地址点击字符串下方注释中的跳转链接,即可跳转至引用它的函数对应的汇编代码处按F5反汇编,生成对应汇编代码处的C语言伪代码分析代码。......
  • 重写SpringCloudGateway路由查找算法,性能提升100倍!
    如果你也在做SpringCloudGateway网关开发,希望这篇文章能给你带来一些启发背景先说背景,某油项目,通过SpringCloudGateway配置了1.6万个路由规则,实际接口调用过程中,会偶现部分接口从发起请求到业务应用处理间隔了大概5秒的时间,经排查后发现是SpringCloudGateway底层在查找对应的R......
  • Wayland入门
    概述Wayland是一个用于构建显示服务器和客户端应用程序的通信协议和库。它旨在取代XWindowSystem(X11)作为Linux和其他操作系统上的图形显示系统。相对于X11,Wayland设计更为简单、现代化,并具有更好的性能和安全性。它采用了一种更直接的通信模型,通过消息传递机制进行客户......
  • Gateway API 实践之(四)FSM Gateway 的重试功能
    网关的重试功能是一种重要的网络通信机制,旨在提高系统服务调用的可靠性和容错性。这个功能允许网关在初次请求失败时自动重新发送请求,从而减少临时性问题(如网络波动、服务瞬时过载等)对最终用户体验的影响。它的工作原理是,当网关向下游服务发送请求时,如果遇到特定类型的失败(如连接错......
  • 【wayn商城】本地开发指南
    这篇文章给大家带来我自己写的开源项目【wayn商城】的本地开发指南,帮助各位朋友在本地快速运行【wayn商城】,避免踩坑,减少不必要的精力在软件下载安装上。......
  • Ways Slots游戏测试要点
    WaysSlots游戏测试要点一、游戏规则和玩法游戏规则和玩法测试要点游戏规则验证:验证游戏规则的文档是否准确、清晰。确认规则中是否包含特殊符号、赌注要求和奖励机制的详细说明。特殊符号功能测试:测试各种特殊符号(Wild、Scatter等)的功能是否符合规则。验证特殊符......
  • 数据库机器迁移对AlwaysON 集群影响测试
    1主3从(共享文件见证)  模拟事故AlwaysON集群结论主域控服务器重启共享文件夹见证失败,SQL集群无影响无影响修改共享文件夹见证路径第一次测试修改后:整个集群突然重启,查询下来不确认是否为修改路径有关,      第二次测试修改后:原有见证路径变成脱机,新路径联机,但集群线上的还是......
  • SQL 2016 AlwaysOn 无域AlwaysOn配置要点
    环境准备:(1)操作系统:WindowsServer2016Datacenter (2)SQLServer2016  配置SQL 2016AlwaysOn要点  1,因为没有域所以需要在”计算机属性“添加计算机的DNS后缀。如后缀是:kk1.com  2,非账户Administrator(是管理员组的新账号也不行),需在运行下列命令以管理员方式运行Po......
  • 配置AlwaysON出错
     在其中一个集群节点的SQLServer中验证各节点的投票数,在其中一个集群节点的SQLServer上执行使用下面SQL语句SELECT*FROMsys.dm_hadr_cluster_members;SELECT*FROMSYS.[dm_hadr_cluster] 7、再次确保各节点已经关闭防火墙,如果防火墙没有关闭,那么在创建可用性组的时候会......
  • SQL Server 2012 AlwaysON 同步延迟时间
     SELECTavailability_mode_desc,role_desc,replica_server_name,last_redone_time,GETDATE()now,DATEDIFF(ms,last_redone_time,GETDATE())diffMSFROM((sys.availability_groupsASagJOINsys.......