由于参加鲲鹏杯一题没解出来(哈哈,就算和豆包激情对话,也是无能为力),所以想试着学一学,看看以后可不可以自己解出来。。。
##准备过程
首先就是重装Ubuntu,原来我之前装的是服务器版,看着别人的桌面版,我还以为我的虚拟机还未开智呢,原来是它的主人还未。。。
os:拿到题目,我在那边研究半天怎么打开靶机,一直在尝试用浏览器,原来是用终端打开啊嘻嘻
补充知识点:
对比一下容易混淆的工具

  • curl / 浏览器:封装好HTTP,底层也是TCP,但你不用手写GET报文
    ​- nc:裸TCP工具,需要手写GET HTTP报文,适合CTF看原始流量

##题目信息
SHARDLINE 分片重组
分类: MISC

SHARDLINE 是一个远程密钥分片服务:它掌握着一个 32 位十六进制密钥,但每个连接最多只允许执行 3 次 GET 查询(n=0..7 对应 8 个 4 位十六进制分片)。你无法用单个连接拿到完整密钥,必须编写自动化脚本反复建立新连接,按编号收集全部分片,按 0..7 顺序拼接成 32 位十六进制密钥,再用 DONE 提交换取 flag。考察在连接限制约束下编写健壮的循环采集客户端的能力。
##解题过程
1. 读懂限制:单连接最多3次查询,不能在同一个会话拿全部分片;

2. 网络编程:循环新建socket连接绕过会话限制,收集分片;

3. 字符串拼接重组数据,提交。
脚本
from pwn import *

host = “direct-ctf2.dasctf.com”
port = 27323

shards = [“”]*8
for i in range(8):
r = remote(host, port)
r.sendline(f”GET {i}”.encode())
res = r.recvline().decode().strip()
shards[i] = res.split()[-1]
r.close()
print(f”shard {i}: {shards[i]}”)

key = “”.join(shards)
print(“full key:”, key)

r = remote(host, port)
r.sendline(f”DONE {key}”.encode())
print(r.recvall().decode())
r.close()
os:我是不是还要认真学一下python,以后自己写脚本啊?