Crypto(5)2023xctf ezCrypto(待补)

下载地址:

https://adworld.xctf.org.cn/match/list?event_hash=a37c4ee0-1808-11ee-ab28-000c29bc20bf

题目代码分析:

#这两行导入了Python标准库中的 random 和 string 模块,用于生成随机数和处理字符串
import random
import stringcharacters = string.printable[:-6]
#这一行创建了一个字符串 characters,其中包含了string.printable中的可打印字符,但去掉了后面6个不常用的控制字符。
digits = string.digits
#这一行创建了一个字符串 digits,其中包含了0到9的数字字符。
ascii_letters = string.ascii_letters
#这一行创建了一个字符串 ascii_letters,其中包含了英文字母的大小写。def Ran_str(seed : int, origin: str):
#这一行定义了一个名为 Ran_str 的函数,它接受两个参数:seed 是一个整数种子,origin 是一个字符串。random.seed(seed)#这一行使用给定的种子初始化随机数生成器,以便生成可重现的随机序列。random_sequence = random.sample(origin, len(origin))#这一行使用给定的 origin 字符串中的字符,生成一个与原字符串长度相同的随机排列。return ''.join(random_sequence)#这一行将生成的随机排列字符列表连接成一个字符串,并将其返回。rseed = int(input())
#这一行从用户输入中获取一个整数种子,该种子将用于生成随机字符串。
assert rseed <= 1000 and rseed >= 0
#这一行使用 assert 语句来确保输入的种子在0到1000之间,以确保种子的范围是合理的。map_string1 = Ran_str(rseed, characters)
map_string2 = Ran_str(rseed * 2, characters)
map_string3 = Ran_str(rseed * 3, characters)
#这三行分别使用不同的种子值生成三个乱序字符串 map_string1、map_string2 和 map_string3,这些字符串将用于加密和解密。#接下来的代码是一系列自定义函数,用于加密字符串。以下是这些函数的解释:#这是一个辅助函数,接受一个字符串 flag 作为参数,返回字符串中从索引9到倒数第二个字符的部分。
def util(flag):return flag[9: -1]#这是另一个辅助函数,接受一个字符串 map_string 和一个字符 c 作为参数,返回字符 c 在字符串 map_string 中的索引位置。
def util1(map_string: str, c):return map_string.index(c)#这是一个函数,用于执行字符串的异或操作。它接受两个字符串 s 和 k 作为参数,然后将这两个字符串按字符进行异或操作,返回结果。
def str_xor(s: str, k: str):return ''.join(chr((ord(a)) ^ (ord(b))) for a, b in zip(s, k))#这是一个名为 mess_sTr 的函数,接受两个参数:一个字符串 s 和一个整数 index。该函数执行了以下操作:def mess_sTr(s : str, index : int):map_str = Ran_str(index, ascii_letters + digits)#1.使用 index 作为种子生成了一个包含英文字母和数字的乱序字符串 map_str。new_str = str_xor(s, map_str[index])#2.对输入字符串 s 和 map_str 中的字符进行异或操作,生成新的字符串 new_str。if not characters.find(new_str) >= 0:new_str = "CrashOnYou??" + s#3.检查 new_str 是否包含在可打印字符集 characters 中,如果不包含,则将字符串改为 "CrashOnYou??" 加上原字符串 s。return new_str, util1(map_str, s)#4.返回新字符串 new_str 和字符在 map_str 中的索引。#这是名为 crypto_phase1 的函数,接受一个字符串 flag 作为参数,执行以下操作:
def crypto_phase1(flag):flag_list1 = util(flag).split('_')#1.使用 util 函数将输入字符串 flag 拆分成一个列表 flag_list1,以下划线为分隔符。newlist1 = []newlist2 = []index = 1k = 0#2.初始化两个空列表 newlist1 和 newlist2,以及两个索引变量 index 和 kfor i in flag_list1:#3.遍历 flag_list1 中的每个子字符串 i,并根据其长度的奇偶性进行不同的处理:if len(i) % 2 == 1:#如果长度为奇数,对子字符串的每个字符执行 mess_sTr 操作,并将结果连接到新字符串 i1 中。同时更新索引。i1 = ""for j in range(len(i)):p, index = mess_sTr(i[j], index)i1 += pp, index = mess_sTr(i[0], index)i1 += pi1 += str(k)k += 1newlist1.append(i1)else:#如果长度为偶数,将子字符串末尾添加上一个递增的数字,并将其加入到 newlist2 中。i += str(k)k += 1newlist2.append(i)return newlist1, newlist2#4.返回两个列表 newlist1 和 newlist2。#这是名为 crypto_phase2 的函数,接受一个列表作为参数,执行以下操作:        
def crypto_phase2(list):newlist = []#1.初始化一个空列表 newlist。for i in list:#2.遍历输入列表中的每个字符串 i。str = ""for j in i:str += map_string1[util1(map_string3, j)]#3.遍历字符串 i 中的每个字符 j,并根据 map_string1 中字符在 map_string3 中的索引位置获取字符,然后将其连接到新字符串 str 中。   newlist.append(str)#4.将新字符串 str 添加到 newlist 中。return newlist#返回包含加密结果的列表 newlist。#这是名为 crypto_phase3 的函数,接受一个列表作为参数,执行以下操作:
def crypto_phase3(list):newlist = []#初始化一个空列表 newlist。for i in list:#遍历输入列表中的每个字符串 i。str = ""for j in i:str += map_string2[util1(map_string3, j)]#遍历字符串 i 中的每个字符 j,并根据 map_string2 中字符在 map_string3 中的索引位置获取字符,然后将其连接到新字符串 str 中。   newlist.append(str)#将新字符串 str 添加到 newlist 中。return newlist#返回包含加密结果的列表 newlist。#这是名为 crypto_final 的函数,接受一个列表作为参数,执行以下操作:
def crypto_final(list):str=""#初始化一个空字符串 str。for i in list[::-1]:#遍历输入列表中的每个字符串 i(以倒序方式遍历)。str += i#将每个字符串 i 连接到结果字符串 str 中。return str#返回最终的加密字符串。#这是一个条件语句,它检查是否在直接运行这个脚本时才执行以下的代码块。
if __name__ == '__main__':format="sixstars{XXX}"flag="Nothing normal will contribute to a crash. So when you find nothing, you find A Crashhhhhhhh!!! "   #这两行定义了两个字符串变量,format 和 flag。flaglist1, flaglist2 = crypto_phase1(flag)#这一行调用 crypto_phase1 函数,对输入的 flag 进行第一阶段加密,然后将结果分成两个列表:flaglist1 和 flaglist2。cipher = crypto_final(crypto_phase3(crypto_phase2(flaglist1) + flaglist1) + crypto_phase2(crypto_phase3(flaglist2)))#这一行对 flaglist1 进行第二和第三阶段的加密,然后将结果拼接起来,最后通过 crypto_final 函数进行最终的加密,得到最终的加密字符串 cipher。print("map_string2: " + map_string2)print("cipher: " + cipher)#这两行分别打印了 map_string2 和加密后的字符串 cipher,以供查看结果。

output:

map_string2: \W93VnRHs<CU#GI!d^7;'Lyfo`qt68&Y=Pr(b)O2[|mc0z}BvKkh5~lJeXM-iNgaTZ]*4F?upw>A,x@DQ.Sj:_$E/%"+{1
cipher: &I1}ty~A:bR>)Q/;6:*6`1;bum?8i[LL*t`1;bum?8i[LL?Ia`1;bum?8i[LL72;xl:mvHF"z4_/DD+c:mvHF"z4_/DDzbZ:mvHF"z4_/DDr}vS?

 解密代码:

参考网站:*CTF 2023 Writeup - 星盟安全团队 (xmcve.com)

import random
import stringrseed = 0
characters = string.printable[:-6]
for rseed  in range(0, 1001):random.seed(rseed)random_sequence = random.sample(characters, len(characters))map_string1 = ''.join(random_sequence)random.seed(rseed * 2)random_sequence = random.sample(characters, len(characters))map_string2 = ''.join(random_sequence)if map_string2[:10] == '8K#Ttr@&5=':print('rseed =', rseed)breakrandom.seed(rseed * 3)
random_sequence = random.sample(characters, len(characters))
map_string3 = ''.join(random_sequence)def re_xor(c, a, index: int):return chr(((ord(a) + index) ^ ord(c)) - index)cipher = "edT0O<jmZ`aP,>3/LZALI]~S=}NP=7zY"
for i in range(0, len(cipher), 2):hou = cipher[:-i]hou = ''.join([map_string3[map_string1.index(h)] for h in hou])hou = ''.join([map_string3[map_string2.index(h)] for h in hou])if hou and hou[-1] in string.digits:qian = cipher[-i:]qian = ''.join([map_string3[map_string2.index(q)] for q in qian])qian1 = qian[:len(qian)//2]qian2 = ''.join([map_string3[map_string1.index(q)] for q in qian[len(qian)//2:]])if qian1 == qian2:qian = qian1print(hou)print(qian)qian11 = qian[:(len(qian)-2)//2]qian22 = qian[-(len(qian) - 2) // 2-1:-1]print(qian11)print(qian22)for c in characters:index = 2qian_ = ''qian_ += ctry:for x in qian11:qian_ += re_xor(x, qian_[-1], index)if all([y  in string.ascii_letters+string.digits for y in qian_]):print(qian_+'3')except:continuefor c in characters:index = 1qian_ = ''qian_ += ctry:for x in qian22:qian_ += re_xor(x, qian_[-1], index)if all([y  in string.ascii_letters+string.digits for y in qian_]):print(qian_+'0')except:continueprint()# cR7PtO5 ln4 s0m32 F1nD1
# ~F3&)0
# F4n3TrY0# sixstars{TrY_F1nD_s0m3_F4n_ln_cR7PtO}

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

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

相关文章

【六:pytest框架介绍】

常见的请求对象requests.get()requests.post()requests.delete()requests.put()requests.request()常见的响应对象reprequests.request()//返回字符串格式数据print(req.text)//返回字节格式数据print(req.content)//返回字典格式数据print(req.json)#状态码print(req.status_c…

LLMs之RAG:利用langchain实现RAG应用五大思路步骤—基于langchain使用LLMs(ChatGPT)构建一个问题回答文档的应用程序实战代码

LLMs之RAG:利用langchain实现RAG应用五大思路步骤—基于langchain使用LLMs(ChatGPT)构建一个问题回答文档的应用程序实战代码 目录 相关文章

基于STM32设计的小龙虾养殖系统(带手机APP)

一、项目介绍 随着人们对健康生活需求的提高,小龙虾逐渐成为现代消费者餐桌上的一道风味佳肴,并且市场需求不断扩大。然而,小龙虾的养殖需要注意许多因素,其中最重要的就是水质条件。水质不良会导致小龙虾死亡率增加,降低养殖效益。因此,为了保证小龙虾的健康生长,必须…

神经网络的发展历史

神经网络的发展历史可以追溯到上世纪的数学理论和生物学研究。以下是神经网络发展史的详细概述&#xff1a; 早期的神经元模型&#xff1a; 1943年&#xff0c;Warren McCulloch和Walter Pitts提出了一种神经元模型&#xff0c;被称为MCP神经元模型&#xff0c;它模拟了生物神经…

v-model修饰符 .lazy .number .trim

1、v-model.lazy“xxx” 默认情况下&#xff0c;v-model它是在每次输入数据时触发input事件来更新数据的 使用 .lazy 修饰符后&#xff0c;当改变数据失去焦点-触发change事件来进行更新数据 2、v-model.number"xxx" 它会自动将输入的值自动转成number 类型&#x…

使用高防服务器有什么好处?103.216.155.x

为什么建议租用高防服务器 第一&#xff0c;高防服务器由于业务的特殊性&#xff0c;本身机器的配置要求高&#xff0c;服务器的价格相比普通的贵&#xff0c;而且&#xff0c;机器还有维护费、托管费等&#xff0c;这会让运营的成本上升。 第二&#xff0c;租用高防服务器&a…

GC overhead limit exceeded问题

1.问题现象 程序包运行时候发生了java.lang.OutOfMemoryError: GC overhead limit exceeded异常&#xff0c; 详细信息如下 org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: org.jboss.util.NestedSQLException: Error; - nested t…

ELK之LogStash插件grok和geoip的配置使用

本文针对LogStash常用插件grok和geoip的使用进行说明&#xff1a; 一、使用grok输出结构化数据 编辑 first-pipeline.conf 文件&#xff0c;修改为如下内容&#xff1a; input{#stdin{type > stdin}file {# 读取文件的路径path > ["/tmp/access.log"]start_…

【斗罗二】冰帝两次险些杀死雨浩,天梦哥求助伊老遭拒绝,霍云儿现身救儿子

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析绝世唐门。 斗罗大陆动画第二部绝世唐门已经更新了&#xff0c;霍雨浩与冰帝完美融合&#xff0c;成功觉醒了第二武魂&#xff0c;霍挂的时代正式到来。只是在整个第19集中&#xff0c;官方做了大量的改编&#xff0c;不但…

Ubuntu 20.04 上安装和配置 neo4j

1. 进入要安装neo4j的ubuntu环境。 2. 添加Debian资源库。 java 1.8.xx版本对应neo4j 3.xx版本&#xff08;jdk 11版本对应neo4j 4.xx版本&#xff09;&#xff1a; &#xff08;1&#xff09;wget -O - https://debian.neo4j.com/neotechnology.gpg.key | sudo apt-key add…

Yolov8-pose关键点检测:模型轻量化创新 |多尺度空洞注意力(MSDA)结合C2f | 中科院一区顶刊 DilateFormer 2023.9

💡💡💡本文解决什么问题:多尺度空洞注意力(MSDA)采用多头的设计,在不同的头部使用不同的空洞率执行滑动窗口膨胀注意力(SWDA),全网独家首发,创新力度十足,适合科研 1)与C2f结合; MSDA | GFLOPs从9.6降低至8.5, mAP50从0.921降低至0.909,mAP50-95从0.697提…

uniapp缓存对象数组

需求&#xff1a;使用uniapp&#xff0c;模拟key&#xff08;表名&#xff09;增删改查对象数组&#xff0c;每个key可以单独操作&#xff0c;并模拟面对对象对应表&#xff0c;每个key对应的baseInstance 类似一个操作类&#xff0c;当然如果你场景比较简单&#xff0c;可以改…

AC修炼计划(AtCoder Regular Contest 167)

传送门&#xff1a;AtCoder Regular Contest 167 - AtCoder 再次感谢樱雪喵大佬的题解&#xff0c;讲的很详细&#xff0c;Orz。 大佬的博客链接如下&#xff1a;Atcoder Regular Contest 167 - 樱雪喵 - 博客园 (cnblogs.com) 第一题很签到&#xff0c;就省略掉了。 第二题…

数据结构——二叉树的公共祖先问题

数据结构——二叉树的公共祖先问题 236. 二叉树的最近公共祖先思路 235. 二叉搜索树的最近公共祖先思路1.递归2.迭代 236. 二叉树的最近公共祖先 236. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#x…

(矩阵) 289. 生命游戏 ——【Leetcode每日一题】

❓ 289. 生命游戏 难度&#xff1a;中等 根据 百度百科 &#xff0c; 生命游戏 &#xff0c;简称为 生命 &#xff0c;是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板&#xff0c;每一个格子都可以看成是一个细胞。每个细胞都具有一…

16-spring AOP核心对象的创建

文章目录 1. aop的几个重要概念2. aop bean definition3. AspectJPointcutAdvisor4.AopConfigUtils5.AnnotationAwareAspectJAutoProxyCreator6. 循环依赖 1. aop的几个重要概念 参考官方解释&#xff1a;https://docs.spring.io/spring-framework/docs/5.2.9.RELEASE/spring-…

大数据之LibrA数据库系统概览

实时监控 “实时监控”页面如图1所示&#xff0c;用户可单击刷新按钮手动刷新当前页面&#xff0c;也可在点刷新按钮前选择自动刷新时长&#xff0c;刷新时长包括&#xff1a;每30秒刷新一次、每60秒刷新一次、停止刷新。 实时监控数据&#xff08;监控时间轴产生的新曲线&am…

Oracle数据中如何在 where in() 条件传参

一、问题场景描述 在sql 条件中&#xff0c;如何在 where in()中想传入参数&#xff0c;如果直接 where in(:seqList)&#xff0c;当传入单个值&#xff0c;seqList: ‘80’ 是没问题的&#xff0c;但是初入多个值时&#xff0c;seqList: ‘80,90’ &#xff0c;因缺少单引号&…

2 用TensorFlow构建一个简单的神经网络

上一篇&#xff1a;1 如何入门TensorFlow-CSDN博客 环境搭建 后续介绍的相关代码都是在pycharm运行&#xff0c;pycharm安装略。 打开pycharm&#xff0c;创建一个新的项目用于tensorflow编码练习&#xff0c;在Terminal输入命令&#xff1a; # 依赖最新版本的pip pip inst…

Pytest自动化测试框架之Allure报告详解

简介 Allure Framework是一种灵活的、轻量级、多语言测试报告工具。 不仅可以以简洁的网络报告形式非常简洁地显示已测试的内容&#xff0c; 而且还允许参与开发过程的每个人从日常执行中提取最大程度的有用信息和测试。 从开发/测试的角度来看&#xff1a; Allure报告可以…