西电CTF平台——NewStar CTF 2024 WriteUP

Week1-Misc杂项

Labyrinth

图片题,kali里filestringszsteg命令一顿梭,没有发现。只能用stegsolve工具了,查看各个通道的图片,在green plane 0、Red plane 0、Blue plane 0三个通道都能看到一张二维码。
image
image
image
用在线二维码扫描工具扫一下,结果都是一样的。
image

decompress(公开赛道)

解压得到decompressit.zippasswd_regex_hint.txt,打开txt文件,里面有提示。
image
正则表达式,提示我们密码的格式是3个小写英文字母1个阿拉伯数字1个小写英文字母,根据这个格式生成密码字典。

import string

alpha = string.ascii_lowercase
digit = string.digits

res = []
for i in alpha:
    for j in alpha:
        for k in alpha:
            for m in digit:
                for n in alpha:
                    res.append(i+j+k+m+n)

with open("password.txt", "w") as file:
    for passwd in res:
        file.write(passwd+"\n")

进行字典爆破,得到密码为xtr4m
image
解压,再把flag.zip.001解压得到flag.txt,拿到flag。
image

decompress(校内赛道)

解压得到16个文件,只需要bindzip打开flag.zip.001解压出flag.txt
image
全部内容计算完md5后,套上flag即可。
image
flag{c6edaba55bac51875a215e2de11c35dd}

pleasingMusic

audacity打开音频,往后拉能看到明显的摩斯密码特征。
image
提取出来进行解密,是乱码。
./..-/---/.-.-/-.--.././.../.-./---/--/-.--../..--/.
image
奇怪了,看下题目描述,一首歌可以好听到正反都好听,将提取出来的摩斯密码倒一下再解密成功。
image
image
全部变为小写就是flag。

兑换码

根据题目描述,就可以猜到图片的长和宽和图片的crc校验值不符,需要修改宽高,放到kali里显示不出来也可以验证是这个问题。
image
先获得图片的crc校验值1c204acf
image
利用脚本爆破正确的长款。

import struct
import binascii
import os

m = open("./荣花与炎日之途.png", "rb").read()
k = 0
for i in range(5000):
    if k == 1:
        break
    for j in range(5000):
        c = m[12:16] + struct.pack('>i', i) + struct.pack('>i', j) + m[24:29]
        crc = binascii.crc32(c) & 0xffffffff
        if crc == 0x1c204acf:
            k = 1
            print(hex(i), hex(j))	# 0xa00 0x4e9
            break

修改图片的长宽如下。
image
打开图片拿到flag。
image

Week1-Crypto 密码学

Base

经过16进制解码,base32解码,base64解码拿到flag。
image

Strange King

根据“抽锐刻 5 的皇帝”可以想到凯撒密码,“娶了个模,回到原点”说明有取模运算。再对照ksjrflag之间的映射关系,每次的增量为2。编写脚本:

base = 5

ciphertext = "ksjr{EcxvpdErSvcDgdgEzxqjql}"
plaintext = ""

for i in ciphertext:
    if i == "{" or i == "}":
        plaintext += i
    else:
        start = ord("A") if i.isupper() else ord("a")
        plaintext += chr((ord(i) - start - base) % 26 + start)
    base += 2
print(plaintext)	# flag{PleaseDoNotStopLearing}

xor

异或的特性:ab=c,ac=b,b^c=a,知道这个就可以写脚本还原了。

from pwn import xor
from Crypto.Util.number import bytes_to_long, long_to_bytes


c1= 8091799978721254458294926060841
c2= b';:\x1c1<\x03>*\x10\x11u;'
key = b'New_Star_CTF'
flag_first = long_to_bytes(c1 ^ bytes_to_long(key))
flag_end = xor(c2, key)
print(flag_first+flag_end)	# b'flag{0ops!_you_know_XOR!}'

如果没有pwn库,使用pip install pwn命令安装即可。

一眼秒了

最入门的rsa题目了,直接对n进行大素数分解,得到p和q,接下来就轻而易举了。(大素数分解可用在线网站或者yafu工具)
image

from Crypto.Util.number import *
from gmpy2 import *
import binascii


e = 65537
c = 48757373363225981717076130816529380470563968650367175499612268073517990636849798038662283440350470812898424299904371831068541394247432423751879457624606194334196130444478878533092854342610288522236409554286954091860638388043037601371807379269588474814290382239910358697485110591812060488786552463208464541069
p = 7221289171488727827673517139597844534869368289455419695964957239047692699919030405800116133805855968123601433247022090070114331842771417566928809956044421
q = 7221289171488727827673517139597844534869368289455419695964957239047692699919030405800116133805855968123601433247022090070114331842771417566928809956045093
phi_n = (p-1)*(q-1)
d = gmpy2.invert(e, phi_n)
m = powmod(c,d,p*q)
print(long_to_bytes(m))	# b'flag{9cd4b35a-affc-422a-9862-58e1cc3ff8d2}'

Week2-Misc杂项

Herta's Study

wireshark打开,导出http对象。
image
upload.php里看到一串代码,是base64编码的,还原看一下。
image
传入的字符串先进行base64编码,然后对字符串中奇数位的字符进行rot13的转换。在多个文件中都可以看到base64编码的字符串,可以一个一个试,真正的字符串在horse.php%3fpayload=type%20f.txt中。

<?php
$ns="ZzxuZ3tmSQNsaGRsUmBsNzVOdKQkZaVZLa0tCt==";
for($i=0;$i<strlen($ns);$i+=1){
    if($i%2==1){
        $ns[$i]=str_rot13($ns[$i]);
    }
}
echo base64_decode($ns);	// flag{sH3_i4_S0_6eAut1fuL.}
?>

wireshark_checkin

wireshark打开,导出http对象,flag就在flag.txt中。
image

wireshark_secret

wireshark打开,导出http对象,flag就在secret.png中。
image

你也玩原神吗

下载得到gif文件,看的时候会看到有东西一闪而过,用stegsolve工具一帧帧查看,第37帧看到内容,保存下来。
image
根据题目关键字原神提瓦特文字搜索得到映射图片。
image
将图片里的文字进行翻译。
中间5行翻译出来,一堆垃圾,无用。

lorem ipsum dolor sit amet
consectetur adipiscing elit
sed do eiusmod tempor
incididunt ut laborc ct
dolorc magna aliqua quis

左上角

flagisasentence

右上角

iiaaelgtsfkfa

左下角

doyouknowfence

右下角

mesioaabgnhnsgogmyeiade

还需要进行栅栏解密,右上角的是假flag,右下角是真的。
image

字里行间的秘密

key.txtsublime工具打开,发现零宽字符,用零宽字符网站解密。
image
image
拿到隐藏文本,打开flag.docx文件,需要密码,将隐藏文本输入,打开。
image
直接全选,复制到sublime中拿到flag。
image

热心助人的小明同学

内存取证题需要用到volatility神器,kali系统或者windows系统都可以。
使用下述命令即可拿到登录密码。
image
故flag为flag{ZDFyVDlfdTNlUl9wNHNTdzByRF9IQUNLRVIh}

用溯流仪见证伏特台风

看视频,大概5分50秒左右看到domain和其下方的内容,但是不清晰。
image
直接豆包搜索我需要2024年7月8日伏特台风II的威胁盟报告原文件,给出了以下两种途径。
image
访问中国国家计算机病毒应急处理中心官网,在首页就能看到2024年7月8日的报告。
image
打开报告放大就能看清了。
image
powerj7kmpzkdhjg4szvcxxgktgk36ezpjxvtosylrpey7svpmrjyuyd.onion
进行md5加密就能拿到flag。
image
flag{6c3ea51b6f9d4f5e}

Week3-Misc杂项

BGM 坏了吗?

Adudacity打开,查看频谱图,发现左声道是噪音,右声道有信息。
image
先分离成单声道。
image
选中下半部分,复制。
image
新建一个文件,将刚刚复制的粘贴进来。
image
然后“文件”->“导出”->“导出为WAV”.
image
最后使用dtfm工具识别即可拿到flag。
image
flag:flag{2024093020241103}

OSINT-MASTER

先查看task.txt,告知flag格式是航班号+照片拍摄时飞机经过的地级市,查看图片属性。
image
得到时间为2024年8月18日下午2点半,在看图片,放大能看到B-2419
image
网上搜索B-2419,进入flightera的官网。
image
点击搜索,将飞机型号输入,随便选择两项中的一项。
image
查看2024年8月份的航班。
image
一直翻到8月18号,只有4个航班,但是满足下午2点半这个时间还在飞的只有MU5156这一航班。
image
剩下的就是找途径的地级市了。一开始我根据航线将其附近的地级市都试了一遍,结果都不对。下载航班管家,首页->航班动态,搜索MU5156,查看飞行成就。
image
找到了北京飞往上海的航线图,将中间的几个城市试一下,得到结果为济宁市。
image
故flag为:flag{MU5156_济宁市}

Week4-Misc杂项

Alt

键盘流量,用tshark命令提取数据。tshark -r keyboard.pcapng -T fields -e usbhid.data | sed '/^\s*$/d' > usbdata.txt得到数据。
image
利用python脚本还原。

normalKeys = {"04": "a", "05": "b", "06": "c", "07": "d", "08": "e", "09": "f", "0a": "g", "0b": "h", "0c": "i",
              "0d": "j", "0e": "k", "0f": "l", "10": "m", "11": "n", "12": "o", "13": "p", "14": "q", "15": "r",
              "16": "s", "17": "t", "18": "u", "19": "v", "1a": "w", "1b": "x", "1c": "y", "1d": "z", "1e": "1",
              "1f": "2", "20": "3", "21": "4", "22": "5", "23": "6", "24": "7", "25": "8", "26": "9", "27": "0",
              "28": "<RET>", "29": "<ESC>", "2a": "<DEL>", "2b": "\t", "2c": "<SPACE>", "2d": "-", "2e": "=", "2f": "[",
              "30": "]", "31": "\\", "32": "<NON>", "33": ";", "34": "'", "35": "<GA>", "36": ",", "37": ".", "38": "/",
              "39": "<CAP>", "3a": "<F1>", "3b": "<F2>", "3c": "<F3>", "3d": "<F4>", "3e": "<F5>", "3f": "<F6>",
              "40": "<F7>", "41": "<F8>", "42": "<F9>", "43": "<F10>", "44": "<F11>", "45": "<F12>",
              "59": "1", "5a": "2", "5b": "3", "5c": "4", "5d": "5", "5e": "6", "5f": "7", "60": "8", "61": "9",
              "62": "0", }

shiftKeys = {"04": "A", "05": "B", "06": "C", "07": "D", "08": "E", "09": "F", "0a": "G", "0b": "H", "0c": "I",
             "0d": "J", "0e": "K", "0f": "L", "10": "M", "11": "N", "12": "O", "13": "P", "14": "Q", "15": "R",
             "16": "S", "17": "T", "18": "U", "19": "V", "1a": "W", "1b": "X", "1c": "Y", "1d": "Z", "1e": "!",
             "1f": "@", "20": "#", "21": "$", "22": "%", "23": "^", "24": "&", "25": "*", "26": "(", "27": ")",
             "28": "<RET>", "29": "<ESC>", "2a": "<DEL>", "2b": "\t", "2c": "<SPACE>", "2d": "_", "2e": "+", "2f": "{",
             "30": "}", "31": "|", "32": "<NON>", "33": "\"", "34": ":", "35": "<GA>", "36": "<", "37": ">", "38": "?",
             "39": "<CAP>", "3a": "<F1>", "3b": "<F2>", "3c": "<F3>", "3d": "<F4>", "3e": "<F5>", "3f": "<F6>",
             "40": "<F7>", "41": "<F8>", "42": "<F9>", "43": "<F10>", "44": "<F11>", "45": "<F12>"}


file = open("usbdata.txt")
res_usb_data = []
for line in file.readlines():
    if line[4:6] in normalKeys:
        res_usb_data.append(normalKeys[line[4:6]])
    elif line[4:6] in shiftKeys:
        res_usb_data.append(shiftKeys[line[4:6]])
    else:
        continue
res = ""
for i in res_usb_data:
    res += i
print(res)	# 1021089710312338190<DEL>30424<DEL>27969<DEL>37327<DEL>9511910511610495971081169521644<DEL>31383<DEL>25143<DEL>9549539553111487979481119537239<DEL>125

看开头的几个数字,就知道是flag{,说明没找错。
一开始看到<DEL>以为是要把其前面的一个字符删除,但是发现翻译过来很多都是非ASCII字符。然后结合题目名字ALT,才知道Alt 加数字键也能打印出字符。看了下中间的数字,分成了以下几部分:
10210897103123 => flag{
38190<DEL>30424<DEL>27969<DEL>37327<DEL>=> 这段不知道怎么翻译,感觉都不太对
95119105116104959710811695=>_with_alt_
21644<DEL>31383<DEL>25143<DEL> => tB7
95495395531114879794811195=>_15_5o0OO0o_
37239<DEL>125=>w}
这题就这样吧,哪位大佬解出来了告知一下。

扫码领取 flag

四个压缩包格式的文件通过file命令可判断为png。
image
改后缀,但是在kali里打不开,全部都是CRC校验错误,用脚本还原。

import struct
import binascii
import os

m = open("fla9.png", "rb").read()
k = 0
for i in range(5000):
    if k == 1:
        break
    for j in range(5000):
        c = m[12:16] + struct.pack('>i', i) + struct.pack('>i', j) + m[24:29]
        crc = binascii.crc32(c) & 0xffffffff
        if crc == 0xAD8705E1:	# 每张图片的crc码
            k = 1
            print(hex(i), hex(j))	# 0xfa 0xfa
            break

这四张图片的crc码都一致,将宽高都改为0xfa即可。
image
每个图片都是二维码的四分之一,拼完整如下。
image
扫描二维码没有内容,经过豆包查询知道这是阿兹特克码。
image

利用在线 AZTEC 二维码阅读器读取。
image

Week5-Misc杂项

zipmaster

解压得到5个加密文件,看到4个文件较小,可以使用crc值爆破出内容。

# 参数crc 为压缩包里面文件CRC32的值
import itertools
import string
import binascii

dic = string.ascii_letters + string.digits + '+/=_!@#$%^&*'
crc = 0x03c90238	# 填每个文件的crc


for secret_number in itertools.product(dic, repeat=3):
    secret_number = ''.join(secret_number)  # 转换元组为字符串
    encoded_s = secret_number.encode('utf-8')  # 编码后的 s
    if binascii.crc32(encoded_s) & 0xffffffff == crc:
        print(secret_number)
        exit(0)

# this_is_key!

密码为this_is_key!,解压得到0721.ziphint.txt
image
提示是明文攻击,看到114514.zip中的hint.txt0721.zip中的hint.txtcrc值一致,可以确认是明文攻击。
image
将解压出来的hint.txt使用bindzip压缩成一个新的压缩包,确保压缩方法一致。
image
使用Advanced Archive Password Recovery软件利用明文攻击。
image
如果长时间没有解出来,就停止,也能得到解压后的压缩包flag.zip
image
这些文件都很大,是个压缩包炸弹,利用HxD打开,拉到最下面,可看到base64编码的字符串。
image
将中间的.去掉,解码。
image
看到504b0304就知道是个压缩包,将数据复制到HxD中保存为111.zip
image
解压需要密码,又看到最后一句话what the fuck i can not see the passwdf4tj4oGMRuI=,对f4tj4oGMRuI=base64解码,全是不可见字符。
image
只能利用python脚本解压了。

import pyzipper
import base64

# 加密的 ZIP 文件名
zip_filename = "111.zip"
# 解压到的目标文件夹
extract_to = "."
# 加密密码
password = base64.b64decode('f4tj4oGMRuI=')

with pyzipper.AESZipFile(zip_filename,'r') as zipf:
    zipf.pwd = password
    zipf.extractall(extract_to)

解压得到Z1文件,用HxD打开拿到flag。
image

posted @ 2025-07-05 22:35  死不悔改奇男子  阅读(531)  评论(0)    收藏  举报