攻防世界-reverse-for-the-holy-grail-350

2023-12-18 04:40

本文主要是介绍攻防世界-reverse-for-the-holy-grail-350,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目下载:下载

载入查壳工具,无壳,直接载入IDA。查看main函数。

 从这里的std::cout,std:cin可以知道这应该就是输出与输入操作,输入为v11,和userIn。在main函数里观察v11好像没有什么重要操作,而userIn在construct函数中出现过,初步判断是flag。对于contruct函数应该就是简单的对执行对象进行初始化操作,并不是关键函数。那从后往前分析。

我们想要走到"Go on. Off you go. tuctf{",那就要v4大于等于0,而v4是由stringMod(v9)求出,所以这可能是个关键函数,跟进:有3个do...while循环语句,先看第一个。

创建空间给v14,然后把a1赋值给v2,然后又给了v12,v14。看if语句,如果条件符合则v4=-1,看到这里第一反应就是肯定不能走v4=-1这个路。(后面会解释)。所以让3*(v3/3)==v3且v12==firstchar[v3/3]就行。这个条件的意思是v3从0开始要是3的倍数并且以v3为下标的v12的那个数要等于firstchar[v3/3]。进入firstchar。有8个元素,并且满足v3/3在这个数组范围中,所以初步判断v3==0,3,6,9,12,15,18,21。也就对应flag的0,3,6,9,12,15,18,21位(其实这个flag一共18位,后面可知)。

解释为什么v4!=-1如果v4==-1,那么return的值为负数,回到函数调用处后赋值给v4,v4为负值,就会执行Ahhh,不会输出flag。

看下一个do...while。

 上面可知把a1赋值给v14,这里又把v14的地址赋值给指针v5,v6,然后进行异或操作,所以这里是对v6即flag进行异或加密。

看第三个do...while

do...while循环中有if判断,如果v11为2执行子句1并且v11又赋值为0,所以v11不可能超过2。不是2就执行else语句,通过观察可知最初v11=0,而让v11变化的就是else语句中的++v11,所以v11一直是0,1,2,0,1,2...循环。搞懂了if...else后看看里面的关键的if语句

第一个if语句是确定flag的第2,5,8,11,14,17位。因为当do...while循环 2,5,8,11,14,17次时,v11==2,才会执行这里,而且v5在遍历flag正好遍历到2,5,8,11,14,17位。所以就剩下flag的1,4,7,10,13,16位未知,所以第二个if应该和这个有关。

在看第二个if,v10是flag的2,5,8,11,14,17位的前两位的乘积,如下图知

 既然我们知道了其余的flag位数就能通过这个if条件求出flag的1,4,7,10,13,16位,这里用正向爆破比较容易。

为什么flag有18位

 v8初值为1,并且v8==19时就停止循环了,而v5是在遍历flag,所以一共遍历18次,所以flag应该18位。

我们观察firstchar,thirdchar,masterArray数组是db类型,而我们需要dd型,利用内嵌python导出数据:

from idc_bc695 import *
addr=[0x601840,0x601860,0x601880]
list=[]
for a in addr:for i in range(6):list.append(Dword(a+4*i))
print('sucessful')
print(list)

 代码:(注意flag异或解密回去)

firstchar=[65, 105, 110, 69, 111, 97] #变化后第0,3,6,9,12,15位
thirdchar=[751, 708, 732, 711, 734, 764]#变化后第2,5,8,11,14,17位
masterarray=[471, 12, 580, 606, 147, 108]#第1,4,7,10,13,16一系列操作后与之相等的数组#求对a1异或的数据列表v7
list=[666,]
v7=666
for i in range(17):v7=v7+v7%5list.append(v7)
print(list)#求flag第0,3,6,9,12,15位
flag= [0 for i in range(18)]
index1=0
for i in range(0,16,3):flag[i]=firstchar[index1]index1=index1+1
print(flag)
#求第2,5,8,11,14,17位 
index2=0
for i in range(2,18,3):flag[i]=list[i]^thirdchar[index2]index2=index2+1
print(flag)
#求第1,4,7,10,13,16位
index3=0
for i in range(1,17,3):for j in range(32,127):if ((list[i-1]^firstchar[index3])*(list[i]^j))%thirdchar[index3]==masterarray[index3]:flag[i]=jindex3=index3+1break
print('tuctf{'+"".join(map(chr,flag))+'}')#tuctf{AfricanOrEuropean?}

这篇关于攻防世界-reverse-for-the-holy-grail-350的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/507072

相关文章

揭秘世界上那些同时横跨两大洲的国家

我们在《世界人口过亿的一级行政区分布》盘点全球是那些人口过亿的一级行政区。 现在我们介绍五个横跨两州的国家,并整理七大洲和这些国家的KML矢量数据分析分享给大家,如果你需要这些数据,请在文末查看领取方式。 世界上横跨两大洲的国家 地球被分为七个大洲分别是亚洲、欧洲、北美洲、南美洲、非洲、大洋洲和南极洲。 七大洲示意图 其中,南极洲是无人居住的大陆,而其他六个大洲则孕育了众多国家和

简单的Q-learning|小明的一维世界(3)

简单的Q-learning|小明的一维世界(1) 简单的Q-learning|小明的一维世界(2) 一维的加速度世界 这个世界,小明只能控制自己的加速度,并且只能对加速度进行如下三种操作:增加1、减少1、或者不变。所以行动空间为: { u 1 = − 1 , u 2 = 0 , u 3 = 1 } \{u_1=-1, u_2=0, u_3=1\} {u1​=−1,u2​=0,u3​=1}

简单的Q-learning|小明的一维世界(2)

上篇介绍了小明的一维世界模型 、Q-learning的状态空间、行动空间、奖励函数、Q-table、Q table更新公式、以及从Q值导出策略的公式等。最后给出最简单的一维位置世界的Q-learning例子,从给出其状态空间、行动空间、以及稠密与稀疏两种奖励函数的设置方式。下面将继续深入,GO! 一维的速度世界 这个世界,小明只能控制自己的速度,并且只能对速度进行如下三种操作:增加1、减

【Linux】萌新看过来!一篇文章带你走进Linux世界

🚀个人主页:奋斗的小羊 🚀所属专栏:Linux 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 前言💥1、初识Linux💥1.1 什么是操作系统?💥1.2 各种操作系统对比💥1.3 现代Linux应用💥1.4 Linux常用版本 💥2、Linux 和 Windows 目录结构对比💥2.1 文件系统组织方式💥2.2

Elasticsearch:无状态世界中的数据安全

作者:来自 Elastic Henning Andersen 在最近的博客文章中,我们宣布了支持 Elastic Cloud Serverless 产品的无状态架构。通过将持久性保证和复制卸载到对象存储(例如 Amazon S3),我们获得了许多优势和简化。 从历史上看,Elasticsearch 依靠本地磁盘持久性来确保数据安全并处理陈旧或孤立的节点。在本博客中,我们将讨论无状态的数据持

【AI大模型应用开发】2.1 Function Calling连接外部世界 - 入门与实战(1)

Function Calling是大模型连接外部世界的通道,目前出现的插件(Plugins )、OpenAI的Actions、各个大模型平台中出现的tools工具集,其实都是Function Calling的范畴。时下大火的OpenAI的GPTs,原理就是使用了Function Calling,例如联网检索、code interpreter。 本文带大家了解下Function calling,看

005:VTK世界坐标系中的相机和物体

VTK医学图像处理---世界坐标系中的相机和物体 左侧是成像结果                                                    右侧是世界坐标系中的相机与被观察物体 目录 VTK医学图像处理---世界坐标系中的相机和物体 简介 1 在三维空间中添加坐标系 2 世界坐标系中的相机 3 世界坐标系中vtkImageData的参数 总结:

leetcode#541. Reverse String II

题目 Given a string and an integer k, you need to reverse the first k characters for every 2k characters counting from the start of the string. If there are less than k characters left, reverse all of

深入RabbitMQ世界:探索3种队列、4种交换机、7大工作模式及常见概念

文章目录 文章导图RabbitMQ架构及相关概念四大核心概念名词解读 七大工作模式及四大交换机类型0、前置了解-默认交换机DirectExchange1、简单模式(Simple Queue)-默认DirectExchange2、 工作队列模式(Work Queues)-默认DirectExchange3、发布/订阅模式(Publish/Subscribe)-FanoutExchange4、路

攻防世界 unseping

unseping 攻防世界web新手练习 -unseping_攻防世界web新手题unseping-CSDN博客 这道题对我来说还是有点难,什么oct绕过命令执行第一次遇到捏,所以基本是跟着别人的wp写的,一点点记录吧 先对源码进行分析 <?phphighlight_file(__FILE__);//定义了一个ease类class ease{private $method;privat