强大的正则表达式——Medium

由上一篇文章《Easy》中提到过的:


还是直接让AI写个python脚本生成难度2的正则表达式,但是生成的正则表达式无法成功获取到flag:


这里了解了一下相关知识,字符串形式的整数对常数求模是可以用有限状态机来实现的。对于二进制数字来讲,在末尾加上 0 相当于将数字乘以 2;在末尾加上 1 相当于将数字乘以 2 再加上 1。


假设状态编号 n 表示「现在的数字为 k % 13 = n」。在状态 n 时每次读到下一个字符时会有两种状态转移:

读到 0 时,在末尾加上 0 之后的数字 k' = 2k

新的状态为 k' % 13 = 2n % 13

读到 1 时,在末尾加上 1 之后的数字 k' = 2k + 1

新的状态为 k' % 13 = (2n + 1) % 13

这个自动机在开始匹配时的状态为 0。在自动机运行完之后,如果处在状态 n,则说明这个二进制数字除 13 余 n。


构建了这个状态机之后,就需要将它转化为正则表达式。我们需要匹配可以被 13 整除的二进制数字,因此起始状态和终止状态都为 0。

状态机转化到正则表达式的思想是一个个删除中间的状态(起始状态和终止状态之外的状态),最后将状态机转化为只有一个状态。删除中间的状态 q 时,我们需要将所有经过状态 q 的路径拼接起来。例如如果有 p -> q -> r 这样一条路径,则需要将 p -> q 和 q -> r 的状态转移拼接起来,得到一条 p -> r 的状态转移。


这里以「匹配 4 的倍数」的状态机举例:

(具体数字可以看下面表格,圈内数字是状态)

读上标部分:

读到 0 时,在末尾加上 0 之后的数字 k' = 2k

新的状态为 k' % 4 = 2n % 4

读到 1 时,在末尾加上 1 之后的数字 k' = 2k + 1

新的状态为 k' % 4 = (2n + 1) % 4

状态k(n)

读上标数字(0,1)

状态k'

0

0

0【(2*0)%4=0】

0

1

1【(2*0+1)%4=1】

1

0

2【(2*1)%4=2】

1

1

3【(2*1+1)%4=3】

2

0

0【(2*2)%4=0】

2

1

1【(2*2+1)%4=1】

3

0

2【(2*3)%4=2】

3

1

3【(2*3+1)%4=3】


删掉状态3:

(0|11*0)


删掉状态2:

(0|11*0)1

(0|11*0)0


删掉状态1:

(1((0|11*0)1)*(0|11*0)0)|0


「匹配 13 的倍数」的状态机也是同理,编写python代码:

# 定义状态数量
n = 13# 初始化状态转移矩阵,每个元素是一个列表,用于存储可能的转移路径
paths = [[[] for _ in range(n)] for _ in range(n)]# 构建状态转移矩阵
for i in range(n):# 从状态 i 读入 0 后转移到状态 (2*i) % npaths[i][(2 * i) % n].append("0")# 从状态 i 读入 1 后转移到状态 (2*i+1) % npaths[i][(2 * i + 1) % n].append("1")# 定义一个函数,用于将多个路径合并成一个正则表达式
def path_union(lst):return "(" + "|".join(lst) + ")"# 当前状态数量
state_count = n# 逐步消除状态,直到只剩下一个状态
while state_count > 1:target = state_count - 1  # 当前要消除的状态loop = ""  # 用于存储目标状态到自身的循环路径# 如果目标状态有自环路径,构建自环正则表达式if len(paths[target][target]) > 0:loop = path_union(paths[target][target]) + "*"# 消除目标状态后,更新其他状态之间的路径for i in range(target):for j in range(target):if len(paths[i][target]) > 0 and len(paths[target][j]) > 0:# 从状态 i 到状态 j 的新路径 = 从 i 到 target 的路径 + 自环路径 + 从 target 到 j 的路径new_path = path_union(paths[i][target]) + loop + path_union(paths[target][j])paths[i][j].append(new_path)# 减少状态数量state_count -= 1# 最终生成的正则表达式是从状态 0 出发并回到状态 0 的所有路径的并集
regex = path_union(paths[0][0]) + "*"# 打印生成的正则表达式
print(f"生成的正则表达式为: {regex}")

但这个正则表达式明显过长了,换一种思路,直接用网络连接来传输生成的正则表达式


加上网络连接部分对应的python代码:

import pwn# 令牌
token = b"531:MEYCIQDHL9dv6rPhZXD7kTqsNQhOCMdkSDmQ9lwfWCGlJGX9WwIhAIRyevrdkoLnKaHDBDnUCADQ9Yt0R6nf5irm5hQwDTiI"# 建立远程连接
conn = pwn.remote('202.38.93.141', 30303)# 发送令牌
conn.send(token)
conn.send(b"\n")# 接收提示信息
conn.recvuntil(b"(1~3): ")# 选择选项2
conn.send(b"2\n")# 接收提示信息
conn.recvuntil(b"regex: ")# 定义状态数量
n = 13# 初始化状态转移矩阵,每个元素是一个列表,用于存储可能的转移路径
paths = [[[] for _ in range(n)] for _ in range(n)]# 构建状态转移矩阵
for i in range(n):# 从状态 i 读入 0 后转移到状态 (2*i) % npaths[i][(2 * i) % n].append("0")# 从状态 i 读入 1 后转移到状态 (2*i+1) % npaths[i][(2 * i + 1) % n].append("1")# 定义一个函数,用于将多个路径合并成一个正则表达式
def path_union(lst):return "(" + "|".join(lst) + ")"# 当前状态数量
state_count = n# 逐步消除状态,直到只剩下一个状态
while state_count > 1:target = state_count - 1  # 当前要消除的状态loop = ""  # 用于存储目标状态到自身的循环路径# 如果目标状态有自环路径,构建自环正则表达式if len(paths[target][target]) > 0:loop = path_union(paths[target][target]) + "*"# 消除目标状态后,更新其他状态之间的路径for i in range(target):for j in range(target):if len(paths[i][target]) > 0 and len(paths[target][j]) > 0:# 从状态 i 到状态 j 的新路径 = 从 i 到 target 的路径 + 自环路径 + 从 target 到 j 的路径new_path = path_union(paths[i][target]) + loop + path_union(paths[target][j])paths[i][j].append(new_path)# 减少状态数量state_count -= 1# 最终生成的正则表达式是从状态 0 出发并回到状态 0 的所有路径的并集
regex = path_union(paths[0][0]) + "*"# 打印生成的正则表达式
#print(f"生成的正则表达式为: {regex}")# 发送生成的正则表达式
conn.send(regex.encode())
conn.send(b"\n")# 进入交互模式
conn.interactive()

成功获取到flag

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

科技改变工作方式:群晖NAS安装内网穿透实现个性化办公office文档分享(1)

文章目录 前言1. 本地环境配置2. 制作本地分享链接3. 制作公网访问链接4. 公网ip地址访问您的分享相册5. 制作固定公网访问链接 前言 本文将详细介绍如何在群晖NAS上安装Synology Office和Synology Drive Server,并利用Cpolar内网穿透工具为本地文档配置固定的公网…

android:taskAffinity 对Activity退出时跳转的影响

android:taskAffinity 对Activity跳转的影响 概述taskAffinity 的工作机制taskAffinity对 Activity 跳转的影响一个实际的开发问题总结参考 概述 在 Android 开发中,任务栈(Task)是一个核心概念。它决定了应用程序的 Activity 如何相互交互以…

运算放大器的学习(三)增益带宽积

我们接着了解运放的相关指标参数,下面我们看下增益带宽积与压摆率. 增益带宽积:即电压增益(Gain)和带宽(Bandwidth)的乘积是一个常数,称为增益带宽积(Gain Bandwidth Product). 增益…

ThinkPHP6门面(Facade)

门面 门面(Facade) 门面为容器中的(动态)类提供了一个静态调用接口,相比于传统的静态方法调用, 带来了更好的可测试性和扩展性,你可以为任何的非静态类库定义一个facade类。 系统已经为大部分…

【概率论】概率密度到底是什么

1. 书本上的定义: 如果对于随机变量X的分布函数F(X),存在一个非负可积函数f(x),使得任意实数x,都有: 称X为连续型随机变量,函数f(x)称为X的概率密度 所谓的概率密度,就是 概率/区间长度 &#…

线代笔记期末复习

第一讲行列式的计算 基础定义和规则 ps: 交换时不止行可以交换,列方便时也可以 我的第一作法:是把行相加,然后后续无差别 范德蒙行列式的计算: 要求第一行/列全为1 每个公比元素作差再相乘 爪型 步骤:…

javaweb快速入门 - 01

1.基本概念 web开发: web,网页的意思 , www.baidu.com静态web html,css提供给所有人看的数据始终不会发生变化! 动态web 淘宝,几乎是所有的网站;提供给所有人看的数据始终会发生变化&#xf…

计算机网络学习笔记-6.应用层

文章目录 客户端-服务器模型(C/S)对等网络模型(P2P)DNS(域名系统)文件传输协议(FTP)FTP的基本功能:FTP的工作原理: 万维网(WWW)URL万维…

使用IDE实现java端远程调试功能

使用IDE实现java端远程调试功能 1. 整体描述2. 前期准备3. 具体操作3.1 修改启动命令3.2 IDE配置3.3 打断点3.4 运行Debug 4. 总结 1. 整体描述 在做项目时,有些时候,需要和第三方进行调式,但是第三方不在一起,需要进行远程调试&…

241118学习日志——[CSDIY] [InternStudio] 大模型训练营 [07]

CSDIY:这是一个非科班学生的努力之路,从今天开始这个系列会长期更新,(最好做到日更),我会慢慢把自己目前对CS的努力逐一上传,帮助那些和我一样有着梦想的玩家取得胜利!!&…

简单爬虫的实现

以下是一个简单爬虫代码的实现: import requests from bs4 import BeautifulSoup# 生成一个包含多个网页 URL 的列表 # 这里我们构造了 50 个页面的 URL,假设网站有多页内容,页数从 1 到 50 urls [f"https://www.cnblogs.com/#p{i}&qu…

RNN简单理解;为什么出现Transformer:传统RNN的问题;Attention(注意力机制)和Self-Attention(自注意力机制)区别;

目录 RNN简单理解 RNN n to n Transformer N to M LSTM 为什么出现Transformer:传统RNN的问题 信息丢失的后果 Rnn是顺序执行的效率不高:顺序执行 Attention(注意力机制)和Self-Attention(自注意力机制)区别 一、计算对象不同 二、应用场景不同 三、功能差异…

小熊派Nano|HarmonyOS初体验-LiteOS内核

在这个万物互联的时代,操作系统作为连接硬件与应用的桥梁,其重要性不言而喻。华为推出的HarmonyOS(鸿蒙操作系统),自诞生以来便备受瞩目,它不仅承载着华为对未来智能生态的愿景,更以其独特的分布…

Linux基础(二十一)——认识系统服务(daemons)

认识系统服务 ( daemons) 1.daemon 与服务 ( service)2. systemd3. systemctl4. systemctl 配置文件 1.daemon 与服务 ( service) 在 Linux 和类 Unix 系统中,daemon(守护进程&…

QT QChart+Eigen库绘制线性回归散点图

QChart+Eigen库绘制线性回归散点图 老套路,一图胜千言 项目结构 代码 mainwindow.h #ifndef MAINWINDOW_H #

uniapp开发微信小程序笔记4-自定义组件

前言:本文重点记录的是uniapp如何封装一个自定义组件,以swiper组件为例。 一、创建组件目录 官方文档中的easycom组件规范中可以看到这样一句话: 只要组件安装在项目的components目录下或uni_modules目录下,并符合components/组…

(三)反向传播 Backpropagation

文章目录 反向传播Backpropagation(1)Chain Rule(2)Forward pass和Backward pass 反向传播Backpropagation 对于计算Gradient Descent这件事情,我们的neural network是有非常非常多的参数,可能有上百万个参…

Dowex 50WX8 ion-exchange resin可以用于去除水中的金属离子(如钠、钾、镁、钙等)和其他杂质,提高水质,11119-67-8

一、基本信息 中文名称:Dowex 50WX8 离子交换树脂 英文名称:Dowex 50WX8 ion-exchange resin CAS号:11119-67-8 供应商:陕西新研博美生物科技 外观:米色至浅棕色或绿棕色粉末/微球状 纯度:≥95% 分子…

国标GB28181视频平台EasyCVR视频融合平台H.265/H.264转码业务流程

在当今数字化、网络化的视频监控领域,大中型项目对于视频监控管理平台的需求日益增长,特别是在跨区域、多设备、高并发的复杂环境中。EasyCVR视频监控汇聚管理平台正是为了满足这些需求而设计的,它不仅提供了全面的管理功能,还支持…

一家餐饮企业,「闯入」AI阵地

作者| 皮爷 出品|产业家 “我们需要用AI来帮助我们门店破除内卷的状态。”一位连锁餐饮品牌告诉产业家,“这也是我们想尽快把AI用起来的原因,看看能不能带来一些帮助。” 这种情况正发生在一众餐饮企业中。 与这种情况对应的一个背景是&#xff0c…