TQLCTF2022 WriteUP(自己做+收集整理+持续更新)

题目下载链接(https://download.csdn.net/download/rickliuxiao/81862001)

[Misc]1.签到

关注微信公众号后,获得1个链接,在源码中找到flag。

[Misc]2. Wizard

访问链接,打开web页面显示的内容如下:

SHA256('TQLCTF' + ?) starts with 58011
Please input the string:

于是,猜测这题需要通过命令行(CLI)界面进行交互。

题目是对字符串 'TQLCTF' + ? 进行SHA256哈希计算,得到的哈希值以 58011 开头。

显然,我们需要根据server端发来的回显信息,提取到哈希值(58011并不是固定的,而是一直会变化)。

随便写一个脚本,爆破sha256哈希值,再发给server端。脚本如下:

from hashlib import sha256
import string
import itertools
import socket
import re

HOST='120.79.12.160'
PORT=41985
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))

def brute_force(pad, shav):
    for i in range(20):
        for str in itertools.product(string.ascii_letters + string.digits, repeat=i):
            t = ''.join(str)
            ts = pad + t
            h = sha256(ts.encode('utf-8')).hexdigest()
            if h.startswith(shav):
                print(ts, t, h)
                return t

content = sock.recv(1024).strip().decode()
print(content)
start1 = len("SHA256('TQLCTF' + ?) starts with ")
pad = 'TQLCTF'
h = content[start1:start1+5]
# print(h)
s2 = brute_force(pad, h).encode()
# print(s2)
sock.send(s2)
sock.send('\n'.encode())
content = sock.recv(1024).strip().decode()
# print(content)

server端再返回了以下信息:

If you want to know Zard's secret, you need to play a game with him.
Zard has an array of n distinct integers. You can ask no more than n questions.
Each question contains m distinct positions. Zard will take the corresponding m numbers from his array and sort them. However, he will only tell you the k-th number among them, in ascending order.
Your task is to guess the size of k.
(1<=k<=m<n<=10000)

You can perform two operations:

1. Query. Your query starts with a capital 'Q', followed by m positions. You will get the k-th element of the integers corresponding to these positions in the array in ascending order. (e.g., Q 2 3 4 5. The answer is 8.)

2. Guess. Your guess starts with a capital 'G', followed by a number, which is k. If your guess is correct, you'll know Zard's secret. (e.g., G 3.)

For example:
Array = [1, 0, 9, 8, 2]
n = 5, m = 4, k = 3

[Query]
Q 2 3 4 5
8

[Guess]
G 3
You are so smart! You will get Zard's secret!

Let's start!
n = 1578, m = 245

题目大意就是:

(1<=k<=m<n<=10000)
1. n: 有一个数组array,其中有n个互不相同的整数,但是乱序的。
2. 我们可以提出n次问题。每次提问时,包括m个数字。每个数字对应的是在数组array中的序号。这m个数字就对应于在数组中的m个数字,假设为array2。
题目会将array2进行排序后的第k个数字返回。但这个k是未知的。
3. 我们需要将k的值猜出来,发回给server端。这样就能得到flag。

n = 1578, m = 245为题,我们可以这样解题:

1. 直接向服务器取数组array中的前m个数据。这里m=245。假设得到array[1...245]。
对这个数组进行排序,得到array2[1..245]。
2. 返回的数字为knumber。
根据题意可知:knumber是array2[1..245]中的第k个数据。
3. 再引入数组array中的第(m+1)个数据,即第246个数据array[246]。
由于每次只能发送m个数字,所以,需要用前面[1..245]中的一个数字q来替换为246。
(1)如果数组array[q]<knumber,且array[246]<knumber,第k个数字仍然是knumber;
(2)如果数组array[q]>knumber,且array[246]>knumber,第k个数字仍然是knumber;
(3)如果数组array[q]<knumber,且array[246]>knumber,第k个数字变为k2number,其中,k2number>knumber;
(4)如果数组array[q]>knumber,且array[246]<knumber,第k个数字变为k2number,其中,k2number<knumber;
由于数组中的数字都互不相同,故array[1...245]中有k-1个数字小于knumber。
如果循环m次(m=245)用前面[1..245]中的一个数字q来替换为246,每次发送数组[1..246]给server后返回一个数字:
(1)当array[246]<knumber时,返回knumber的数量就是k。
(2)当array[246]>knumber时,返回k2number的数量就是k。
【不知道这样推导正确不正确。求大佬指正!】

按照上面的思路,写脚本如下:

# 前部分的脚本仍保持不变。
from hashlib import sha256
import string
import itertools
import socket
import re

HOST='120.79.12.160'
PORT=41985
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))

def brute_force(pad, shav):
    for i in range(20):
        for str in itertools.product(string.ascii_letters + string.digits, repeat=i):
            t = ''.join(str)
            ts = pad + t
            h = sha256(ts.encode('utf-8')).hexdigest()
            if h.startswith(shav):
                print(ts, t, h)
                return t

content = sock.recv(1024).strip().decode()
print(content)
start1 = len("SHA256('TQLCTF' + ?) starts with ")
pad = 'TQLCTF'
h = content[start1:start1+5]
# print(h)
s2 = brute_force(pad, h).encode()
# print(s2)
sock.send(s2)
sock.send('\n'.encode())
content = sock.recv(1024).strip().decode()
# print(content)

# ========================以下是新增的部分脚本:========================
# 提取n和m。
last = content.split('\n')[-1]
print(last)
n = re.findall(r'n = (\d.*),',last)[0]
m = re.findall(r', m = (\d.*)',last)[0]
print(n,m)

# 先向server端发送m个数字[1..m],得到knumber
lq = ["Q"]
for i in range(int(m)):
    lq.append(str(i+1))

q = ' '.join(lq)
# print(q)
sock.send(q.encode())
sock.send('\n'.encode())
content = sock.recv(1024).strip().decode()
print(content)
knumber = content

# 循环m次:每次循环时,将[1..m]中的一个数字替换为(m+1)
tc = [content]
for i in range(int(m)):
    lq = ["Q"]
    for j in range(int(m)):
        if i==j:
            lq.append(str(int(m)+1))
        else:
            lq.append(str(j+1))
    q = ' '.join(lq)
    # print(q)
    sock.send(q.encode())
    sock.send('\n'.encode())
    content = sock.recv(1024).strip().decode()
    # print(content)
    tc.append(content)
# print(tc) # tc中只有2个不同的数字:knumber和k2number。

# 大概有一半的机率是 array[246]<knumber 。 假设“knumber的数量就是k”
g = "G " + str(tc.count(knumber)) + '\n'
print(g)
sock.send(g.encode())
content = sock.recv(1024).strip().decode()
print(content)

[Mis]3.Ranma½
notepad++打开文件,发现是乱码。
在这里插入图片描述

猜测是基于零宽字符的加密信息隐写。在以下网站(https://330k.github.io/misc_tools/unicode_steganography.html)中,拷贝所有内容填写到右边,在左边提取出隐写的信息。
在这里插入图片描述
在末尾发现字符串: HTTPZB{QFOLP6_KRZ1Q}
猜测其格式应为 TQLCTF{…},估计是Vigenere编码。但密码未知。
在以下网站(https://www.guballa.de/vigenere-solver)进行爆破,得到flag。
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
iscc2015是国际信号与通信会议(International Symposium on Communication and Information Technologies)的官方writeup,在这个writeup中,主要回顾了iscc2015会议的主要内容和成果。 iscc2015会议是由IEEE(Institute of Electrical and Electronics Engineers)主办的,旨在聚集来自全球的学者、研究人员和专业人士,共同探讨和交流关于通信和信息技术领域的最新研究和发展。 这个writeup首先介绍了iscc2015会议的背景和目标,提及了该会议为促进学术界和工业界之间的合作、创新和知识交流所的努力。接着,该writeup详细描述了iscc2015会议的主要议题,包括通信网络、无线通信、数据通信和网络安全等方面。此外,还列举了一些重要的研究课题和领域,如物联网、云计算、移动通信和多媒体通信等。 iscc2015的writeup还总结了会议期间的重要活动和成果。这些活动包括学术论文的研讨会和展示、专题演讲、研讨会和研究项目的发布等。会议期间,各个领域的专家和学者积极参与并互相交流了关于通信和信息技术领域的最新研究成果和创新理念。 最后,iscc2015的官方writeup总结了会议的收获和影响。该会议为全球通信和信息技术领域的研究人员和专业人士提供了一个交流和合作的平台,推动了相关领域的发展和创新。此外,与会者还从中获得了有关新技术、新方法和最佳实践的信息和经验。 总之,iscc2015官方writeup回顾了这个国际会议的主要内容和成果,强调了其在通信和信息技术领域的重要性和影响。通过促进学术界和工业界之间的交流与合作,这个会议为促进全球通信和信息技术领域的发展出了贡献。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jia9iniu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值