【CTF-编程-NC】上下火车

发布时间:2026/7/28 2:13:02
【CTF-编程-NC】上下火车 题目一列火车从始发站开出沿途经过若干车站。由于售票系统的故障车站的统计逻辑变得非常古怪。你作为应急响应小组的一员需要接入系统的远程终端在规定时间内计算出指定车站开出时车上的人数。列车运行规则第 1 站始发站 上车人数为 a无人下车。第 2 站 有 u 人上车同时有 u 人下车。离开本站时车上人数保持为 a 。第 3 站起至第 n-1 站上车人数 等于前两站“上车人数”之和。下车人数 等于上一站的“上车人数”。第 n 站终点站 所有人下车。已知在终点站下车的人数为m。交互说明本题为交互题你需要通过 nc 访问服务器。服务器会连续给出 100 组 随机生成的参数。每组参数包含四个整数a始发站人数、n车站总数、m终点站下车人数、x目标车站。Round [i/100] Stations (n): 13 Initial (a): 5 Total at n-1 (m): 2392 Target station (x): 5直接发送一个整数并换行表示第xxx站开出时车上的总人数。核心思路循环u的值从1到m-1然后遍历第3到第n个车站上车人数的数组shang[i]shang[i-1]shang[i-2]下车人数的数组xia[i]shang[i-1]当前车站人数total[i-1]shang[i]-xia[i]直到某个u的值符合最终人数m即可。有时会因为数值太大而超时那就再来一次编写代码计算方法# 导入必要的库frompwnimport*# 用于网络连接和交互importre# 用于正则表达式匹配defsolve_round(n,a,m,x): 计算指定车站x的车上人数同时计算u值 参数: n: 车站总数 a: 第1站始发站的上车人数 m: 第n站终点站的下车人数即第n-1站结束时的车上人数 x: 目标车站编号 返回: int: 目标车站x的车上人数 # 特殊情况处理ifn1:returnaelifn2:returnaelifn3:return2*aifx3elsea# 初始化数组shang[0]*(n1)# 上车人数数组shang[i]表示第i站的上车人数xia[0]*(n1)# 下车人数数组xia[i]表示第i站的下车人数total[0]*(n1)# 车上人数数组total[i]表示第i站结束时的车上人数# 第1站shang[1]a xia[1]0total[1]a# 尝试不同的u值直到找到满足条件的uforuinrange(0,m1):# u可以等于m# 第2站shang[2]u xia[2]u total[2]total[1]shang[2]-xia[2]# 第3站到第n站foriinrange(3,n1):shang[i]shang[i-1]shang[i-2]# 上车人数 前两站上车人数之和xia[i]shang[i-1]# 下车人数 上一站上车人数total[i]total[i-1]shang[i]-xia[i]# 当前车上人数 前一站车上人数 本站上车人数 - 本站下车人数# 检查第n-1站的车上人数是否等于miftotal[n-1]m:# 找到正确的u值直接返回目标车站x的车上人数returntotal[x]return0# 未找到合适的u返回0# 示例用法if__name____main__:# 测试示例1n20, a5, m51901n20# 车站总数a5# 初始上车人数m51901# 终点站下车人数# 计算第12站的车上人数同时计算u值x12anssolve_round(n,a,m,x)print(f对于n{n}, a{a}, m{m}车站{x}的人数为:{ans})# 测试示例2n6, a5, m17已知结果车站3的人数为10车站4的人数为15车站5的人数为17n6a5m17forxinrange(1,6):anssolve_round(n,a,m,x)print(f对于n{n}, a{a}, m{m}车站{x}的人数为:{ans})# 注意实际比赛中应该调用main()函数连接服务器# main()运行结果对于n20,a5,m51901车站12的人数为:1776对于n6,a5,m17车站1的人数为:5对于n6,a5,m17车站2的人数为:5对于n6,a5,m17车站3的人数为:10对于n6,a5,m17车站4的人数为:11对于n6,a5,m17车站5的人数为:17批量执行importsocketimportre# 导入solve.py中的solve_round函数fromsolveimportsolve_rounddefmain():# 连接信息hostchallenge.qsnctf.comport33522# 创建socket连接withsocket.socket(socket.AF_INET,socket.SOCK_STREAM)ass:s.connect((host,port))# 设置超时s.settimeout(10.0)# 接收并打印初始信息try:initial_datas.recv(4096).decode()print(初始信息:)print(initial_data)exceptsocket.timeout:print(接收初始信息超时)# 循环处理多个回合whileTrue:print(\n 等待新回合 )try:# 接收完整问题# 读取直到收到换行符或足够的数据datawhileTrue:chunks.recv(4096).decode()ifnotchunk:print(连接已关闭)exit()datachunk# 检查是否包含完整的问题包含所有必要参数和结束标记ifYour answer for stationindata:breakprint(接收到完整问题:)print(data)# 检查是否已获得flagifflag{indata.lower()orqsn{indata.lower():print(\n已获得flag!)break# 检查是否需要退出ifnotdata:print(未接收到数据退出)break# 解析问题提取n, a, m, x参数# 使用正则表达式提取与关键参数相关的数字n_matchre.search(rStations \(n\):\s*(\d),data)a_matchre.search(rInitial \(a\):\s*(\d),data)m_matchre.search(rTotal at n-1 \(m\):\s*(\d),data)x_matchre.search(rTarget station \(x\):\s*(\d),data)print(f正则匹配结果: n_match{n_match}, a_match{a_match}, m_match{m_match}, x_match{x_match})ifn_matchanda_matchandm_matchandx_match:nint(n_match.group(1))aint(a_match.group(1))mint(m_match.group(1))xint(x_match.group(1))print(f\n解析到参数: n{n}, a{a}, m{m}, x{x})# 使用solve_round函数计算结果resultsolve_round(n,a,m,x)print(f计算结果:{result})# 发送结果s.sendall(f{result}\n.encode())print(结果已发送)# 接收响应responses.recv(4096).decode()print(响应:)print(response)# 检查响应中是否有真正的flagifflag{inresponse.lower()orqsn{inresponse.lower():print(\n已获得flag!)break# 检查响应是否为错误ifwronginresponse.lower():print(\n计算结果错误继续尝试下一个回合)continueelse:print(无法解析问题提取的数字不足)exceptsocket.timeout:print(接收数据超时)breakexceptExceptionase:print(f处理过程中出错:{e})importtraceback traceback.print_exc()breakif__name____main__:main()运行结果Welcome to the Train Logistic Challenge!等待新回合接收到完整问题: Solve100rounds of theTrain Problemto get the flag. Rules: You have1.5s per round. Good luck!--- Round[1/100]--- Stations(n):12Initial(a):20Total at n-1(m):1726Target station(x):9Your answerforstation9: 正则匹配结果:n_matchre.Match object;span(124,140),matchStations (n): 12,a_matchre.Match object;span(141,156),matchInitial (a): 20,m_matchre.Match object;span(157,179),matchTotal at n-1 (m): 1726,x_matchre.Match object;span(180,201),matchTarget station (x): 9解析到参数:n12,a20,m1726,x9计算结果:660结果已发送 响应:[]Correct!等待新回合接收到完整问题: --- Round[2/100]--- Stations(n):14Initial(a):3Total at n-1(m):4417Target station(x):9Your answerforstation9: 正则匹配结果:n_matchre.Match object;span(23,39),matchStations (n): 14,a_matchre.Match object;span(40,54),matchInitial (a): 3,m_matchre.Match object;span(55,77),matchTotal at n-1 (m): 4417,x_matchre.Match object;span(78,99),matchTarget station (x): 9解析到参数:n14,a3,m4417,x9计算结果:622结果已发送 响应:[]Correct!等待新回合......解析到参数:n19,a4,m15124,x16计算结果:5775结果已发送 响应:[]Correct!等待新回合接收到完整问题: --- Round[100/100]--- Stations(n):7Initial(a):20Total at n-1(m):172Target station(x):1Your answerforstation1: 正则匹配结果:n_matchre.Match object;span(25,40),matchStations (n): 7,a_matchre.Match object;span(41,56),matchInitial (a): 20,m_matchre.Match object;span(57,78),matchTotal at n-1 (m): 172,x_matchre.Match object;span(79,100),matchTarget station (x): 1解析到参数:n7,a20,m172,x1计算结果:20结果已发送 响应:[]Correct!Congratulations!Flag: qsnctf{ad27803e80ec4d7aa2e663aed540aa8a}等待新回合连接已关闭