【CTF-编程-NC】罗马数字和整数的转换
题目罗马数字转整数欢迎来到编程世界你将连接到一个交互式服务。在每一轮中服务端会向你提供一个罗马数字你的任务是将其正确转换为对应的整数。请使用NC连接分数连接测试编写代码#!/usr/bin/env python3# -*- coding: utf-8 -*- CTF 解题脚本 - 罗马数字转整数自动解题器 该脚本用于自动连接 CTF 挑战服务器接收罗马数字转换题目计算答案并发送回服务器 直到获得 flag 或连接断开。 依赖库: - socket: 用于建立 TCP 连接 - re: 用于正则表达式匹配罗马数字 - time: 用于添加延迟防止请求过快 使用方法: 1. 确保脚本具有执行权限: chmod x exploit.py 2. 直接运行脚本: python3 exploit.py 注意事项: - 请确保网络连接正常 - 服务器地址和端口可能需要根据实际情况修改 - 脚本设置了 30 秒超时可根据需要调整 importsocket# 导入 socket 库用于网络通信importre# 导入正则表达式库用于解析罗马数字importtime# 导入时间库用于添加延迟defroman_to_int(roman): 将罗马数字字符串转换为整数的核心函数 参数: roman (str): 输入的罗马数字字符串仅包含大写字母 IVXLCDM 返回: int: 转换后的整数值 罗马数字转换规则: 1. 基本字符对应的值: I 1, V 5, X 10, L 50, C 100, D 500, M 1000 2. 组合规则: - 当较小的数字出现在较大的数字左边时需要减去该值如 IV 4, IX 9, XL 40 - 当较小的数字出现在较大的数字右边时需要加上该值如 VI 6, XI 11, LX 60 3. 限制规则: - 相同的数字最多连续出现三次如 III 3, XXX 30 - 左减不能跨越一个位数如 99 是 XCIX不是 IC 算法原理: 从右到左遍历罗马数字字符串维护一个前一个字符的值: - 如果当前字符值小于前一个字符值说明需要减去当前值 - 否则加上当前值 这种方法可以高效处理所有罗马数字组合包括特殊的左减情况 # 定义罗马数字字符到整数的映射字典roman_map{I:1,# 基本字符: I 1V:5,# 基本字符: V 5X:10,# 基本字符: X 10L:50,# 基本字符: L 50C:100,# 基本字符: C 100D:500,# 基本字符: D 500M:1000# 基本字符: M 1000}total0# 初始化总和为 0prev_value0# 初始化前一个字符的值为 0# 从右到左遍历罗马数字字符串forcharinreversed(roman):# 获取当前字符对应的整数值valueroman_map[char]# 根据规则判断是加还是减ifvalueprev_value:total-value# 当前值小于前一个值需要减去当前值else:totalvalue# 当前值大于等于前一个值需要加上当前值# 更新前一个字符的值用于下一次循环比较prev_valuevaluereturntotal# 返回转换后的整数值defsolve(): 主解题函数负责处理与 CTF 服务器的通信和解题流程 详细流程: 1. 配置服务器连接信息主机名和端口 2. 创建 TCP socket 并设置超时 3. 连接到指定的 CTF 服务器 4. 进入主循环持续接收服务器数据: a. 接收服务器发送的数据并解码 b. 检查是否接收到 flag 或连接断开 c. 检查是否需要退出收到 Bye 消息 d. 如果收到输入提示符 则解析题目: i. 分割接收到的数据为多行 ii. 查找包含 Round 的行表示新的一轮题目 iii. 获取下一行作为罗马数字行 iv. 使用正则表达式提取罗马数字 v. 调用 roman_to_int 函数计算答案 vi. 将答案发送回服务器 vii. 清空缓冲区准备下一轮 5. 异常处理捕获并打印所有异常 6. 无论是否发生异常都确保关闭 socket 连接 # 服务器配置信息hostchallenge.qsnctf.com# CTF 服务器主机名port32813# CTF 服务器端口号# 创建 TCP socket 对象# socket.AF_INET: 使用 IPv4 地址# socket.SOCK_STREAM: 使用 TCP 协议socksocket.socket(socket.AF_INET,socket.SOCK_STREAM)# 设置 socket 超时时间为 30 秒防止无限等待sock.settimeout(30)# 连接到 CTF 服务器sock.connect((host,port))try:# 初始化缓冲区用于存储接收到的数据buffer# 主循环持续处理服务器数据whileTrue:# 接收服务器数据最多接收 4096 字节# decode(utf-8, errorsignore): 使用 UTF-8 解码忽略解码错误datasock.recv(4096).decode(utf-8,errorsignore)# 如果没有接收到数据说明连接已断开退出循环ifnotdata:break# 将新接收到的数据添加到缓冲区bufferdata# 打印接收到的数据使用 repr() 显示不可见字符print(Received:,repr(data))# 检查缓冲区中是否包含 flag 或 qsnctf不区分大小写ifflaginbuffer.lower()orqsnctfinbuffer.lower():print(Found flag!)# 找到 flag打印提示print(buffer)# 打印完整的缓冲区内容break# 退出循环# 检查是否收到退出消息ifByeinbufferorbyeinbuffer:print(buffer)# 打印退出消息break# 退出循环# 检查是否收到输入提示符 ifinbuffer:# 将缓冲区按换行符分割为多行linesbuffer.split(\n)# 遍历每一行查找包含 Round 的行表示新的一轮forlineinlines:ifRoundinline:# 获取包含 Round 的行在列表中的索引idxlines.index(line)# 检查下一行是否存在ifidx1len(lines):# 获取下一行并去除首尾空白字符roman_linelines[idx1].strip()# 使用正则表达式匹配罗马数字仅包含 IVXLCDM 字符matchre.search(r[IVXLCDM],roman_line)ifmatch:# 提取匹配到的罗马数字romanmatch.group()print(Roman numeral:,roman)# 打印提取到的罗马数字# 调用罗马数字转换函数计算答案resultroman_to_int(roman)print(Answer:,result)# 打印计算结果# 将答案转换为字符串并添加换行符然后编码为字节发送sock.send((str(result)\n).encode(utf-8))# 清空缓冲区准备接收下一轮数据buffer# 添加 0.5 秒延迟防止请求过快导致服务器拒绝time.sleep(0.5)break# 跳出当前循环处理下一轮数据exceptExceptionase:# 捕获并打印所有异常print(Error:,e)finally:# 无论是否发生异常都确保关闭 socket 连接sock.close()# 主程序入口if__name____main__:# 调用主解题函数solve()运行结果Received:You need to convert the Roman numerals I provided to integersReceived:\nRound 1:\nMMDCCCIX\n Roman numeral: MMDCCCIX Answer:2809Received:Correct!\n\nRound 2:\nMMMCXLIV\n Roman numeral: MMMCXLIV Answer:3144Received:Correct!\n\nRound 3:\nCMXCIII\n Roman numeral: CMXCIII Answer:993Received:Correct!\n\nRound 4:\nMCDLXI\n Answer:528......Received:Correct!\n\nRound 97:\nMMCDXLIV\n Roman numeral: MMCDXLIV Answer:2444Received:Correct!\n\nRound 98:\nMMMLXX\n Roman numeral: MMMLXX Answer:3070Received:Correct!\n\nRound 99:\nMMDCXII\n Roman numeral: MMDCXII Answer:2612Received:Correct!\n\nRound 100:\nDCCXXXII\n Roman numeral: DCCXXXII Answer:732Received:Correct!\n\nCongratulations! Here is your flag:\nqsnctf{e1dc67cb2e7b4cf6a6247939ce2acdc7}\nFound flag!Correct!Congratulations!Here is your flag: qsnctf{e1dc67cb2e7b4cf6a6247939ce2acdc7}

相关新闻

Ghidra逆向工程:系统化恢复函数签名与类型信息的方法论

Ghidra逆向工程:系统化恢复函数签名与类型信息的方法论

1. 项目概述:当Ghidra的“魔法”失灵时如果你和我一样,长期混迹于逆向工程和安全分析领域,那么Ghidra绝对是你工具箱里不可或缺的瑞士军刀。作为NSA开源的神器,它免费、强大,集成了反汇编、反编译、脚本化分析等一系列…

2026/10/9 2:06:56 阅读更多 →
3步破解电子课本获取难题:智能解析工具深度指南

3步破解电子课本获取难题:智能解析工具深度指南

3步破解电子课本获取难题:智能解析工具深度指南 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载,让您更方便地获取课本内容。 项目地址: http…

2026/10/10 22:37:21 阅读更多 →
SpringBoot智慧乡村旅游平台架构设计与实践

SpringBoot智慧乡村旅游平台架构设计与实践

1. 项目背景与核心价值乡村旅游作为乡村振兴战略的重要抓手,正经历从传统观光向智慧化服务的转型。这个基于SpringBoot的智慧乡村旅游服务平台,本质上是一个农旅融合的数字化解决方案,旨在解决三个行业痛点:信息孤岛问题&#xff…

2026/10/11 17:14:55 阅读更多 →

最新新闻

德思特 GNSS 模拟器技术参数详解:700+通道、1000Hz 迭代率、可模拟1200颗卫星的全星座仿真方案

德思特 GNSS 模拟器技术参数详解:700+通道、1000Hz 迭代率、可模拟1200颗卫星的全星座仿真方案

在高阶自动驾驶 HiL 闭环、低空无人系统及高动态 PNT(定位、导航、定时)测试中,传统户外路测往往受环境干扰大且场景难以 100% 复现。针对工程选型关注的核心参数与信号支持能力,德思特 GNSS 模拟器基于 Skydel 引擎与 SDA 软件定…

2026/10/11 22:52:37 阅读更多 →
vnpy量化实战:多因子选股+LightGBM动态仓位优化闭环

vnpy量化实战:多因子选股+LightGBM动态仓位优化闭环

简介:本资源是一套基于vn.py框架深度二次开发的量化投资实践项目,面向金融工程开发者、量化交易学习者及AI金融交叉领域从业者,解决选股自动化、策略回测工程化与机器学习模型集成等核心问题。压缩包共1656个文件,体量59.07MB&…

2026/10/11 22:52:37 阅读更多 →
vllm-metal 加载 GGUF 量化模型完整指南:Mac 本地部署 LLM 的省钱秘籍

vllm-metal 加载 GGUF 量化模型完整指南:Mac 本地部署 LLM 的省钱秘籍

【免费下载链接】vllm-metal Community maintained hardware plugin for vLLM on Apple Silicon 项目地址: https://gitcode.com/gh_mirrors/vl/vllm-metal 点击查看 免费下载 vllm-metal 是一个社区维护的硬件插件,让 vLLM 能够运行在 Apple Silicon&a…

2026/10/11 22:52:37 阅读更多 →
家电维修预约欧米到家|博世洗衣机维修预约|附近师傅上门检修|欧米到家报修热线

家电维修预约欧米到家|博世洗衣机维修预约|附近师傅上门检修|欧米到家报修热线

前言🌆 国内住宅业态丰富,各地老城老旧管网老化、水质杂质多,城市高层住宅水压波动频繁,全国大部分地区属于湿润气候,梅雨季、多雨季节潮湿多雨、空气湿度极高,冬夏温差大,差异化的居家工况让洗…

2026/10/11 22:52:37 阅读更多 →
构网型储能变流器参数整定:虚拟惯量、阻尼与下垂系数实战解析

构网型储能变流器参数整定:虚拟惯量、阻尼与下垂系数实战解析

最近在调试一个构网型储能样机,100kW 的柜子在离网工况下带 RLC 负载,光是 J 和 D 两个参数就调了两个晚上。功率波形要么像水面波纹一样持续荡漾,要么频率响应慢到让人怀疑控制器死机。后来我才意识到,构网型变流器能不能真正工程…

2026/10/11 22:52:37 阅读更多 →
MySQL子查询完全指南:分类、执行流程、性能优化与常见坑

MySQL子查询完全指南:分类、执行流程、性能优化与常见坑

子查询在MySQL里被很多人当成"会用但说不清"的技术点。SQL子查询用得好,能把复杂统计拆成清晰的嵌套逻辑;用不好,一条慢查询直接拖垮业务接口。这篇文章我把子查询从分类、执行流程到性能优化、报错排查完整过一遍,所有…

2026/10/11 22:51:36 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →