西電CTF平臺——NewStar CTF 2024 WriteUP
Week1-Misc雜項
Labyrinth
圖片題,kali里file、strings、zsteg命令一頓梭,沒有發現。只能用stegsolve工具了,查看各個通道的圖片,在green plane 0、Red plane 0、Blue plane 0三個通道都能看到一張二維碼。



用在線二維碼掃描工具掃一下,結果都是一樣的。

decompress(公開賽道)
解壓得到decompressit.zip和passwd_regex_hint.txt,打開txt文件,里面有提示。

正則表達式,提示我們密碼的格式是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。

解壓,再把flag.zip.001解壓得到flag.txt,拿到flag。

decompress(校內賽道)
解壓得到16個文件,只需要bindzip打開flag.zip.001解壓出flag.txt。

全部內容計算完md5后,套上flag即可。

flag{c6edaba55bac51875a215e2de11c35dd}
pleasingMusic
audacity打開音頻,往后拉能看到明顯的摩斯密碼特征。

提取出來進行解密,是亂碼。
./..-/---/.-.-/-.--.././.../.-./---/--/-.--../..--/.

奇怪了,看下題目描述,一首歌可以好聽到正反都好聽,將提取出來的摩斯密碼倒一下再解密成功。


全部變為小寫就是flag。
兌換碼
根據題目描述,就可以猜到圖片的長和寬和圖片的crc校驗值不符,需要修改寬高,放到kali里顯示不出來也可以驗證是這個問題。

先獲得圖片的crc校驗值1c204acf。

利用腳本爆破正確的長款。
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
修改圖片的長寬如下。

打開圖片拿到flag。

Week1-Crypto 密碼學
Base
經過16進制解碼,base32解碼,base64解碼拿到flag。

Strange King
根據“抽銳刻 5 的皇帝”可以想到凱撒密碼,“娶了個模,回到原點”說明有取模運算。再對照ksjr和flag之間的映射關系,每次的增量為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工具)

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對象。

在upload.php里看到一串代碼,是base64編碼的,還原看一下。

傳入的字符串先進行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中。

wireshark_secret
wireshark打開,導出http對象,flag就在secret.png中。

你也玩原神嗎
下載得到gif文件,看的時候會看到有東西一閃而過,用stegsolve工具一幀幀查看,第37幀看到內容,保存下來。

根據題目關鍵字原神提瓦特文字搜索得到映射圖片。

將圖片里的文字進行翻譯。
中間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,右下角是真的。

字里行間的秘密
key.txt用sublime工具打開,發現零寬字符,用零寬字符網站解密。


拿到隱藏文本,打開flag.docx文件,需要密碼,將隱藏文本輸入,打開。

直接全選,復制到sublime中拿到flag。

熱心助人的小明同學
內存取證題需要用到volatility神器,kali系統或者windows系統都可以。
使用下述命令即可拿到登錄密碼。

故flag為flag{ZDFyVDlfdTNlUl9wNHNTdzByRF9IQUNLRVIh}
用溯流儀見證伏特臺風
看視頻,大概5分50秒左右看到domain和其下方的內容,但是不清晰。

直接豆包搜索我需要2024年7月8日伏特臺風II的威脅盟報告原文件,給出了以下兩種途徑。

訪問中國國家計算機病毒應急處理中心官網,在首頁就能看到2024年7月8日的報告。

打開報告放大就能看清了。

powerj7kmpzkdhjg4szvcxxgktgk36ezpjxvtosylrpey7svpmrjyuyd.onion
進行md5加密就能拿到flag。

flag{6c3ea51b6f9d4f5e}
Week3-Misc雜項
BGM 壞了嗎?
Adudacity打開,查看頻譜圖,發現左聲道是噪音,右聲道有信息。

先分離成單聲道。

選中下半部分,復制。

新建一個文件,將剛剛復制的粘貼進來。

然后“文件”->“導出”->“導出為WAV”.

最后使用dtfm工具識別即可拿到flag。

flag:flag{2024093020241103}
OSINT-MASTER
先查看task.txt,告知flag格式是航班號+照片拍攝時飛機經過的地級市,查看圖片屬性。

得到時間為2024年8月18日下午2點半,在看圖片,放大能看到B-2419。

網上搜索B-2419,進入flightera的官網。

點擊搜索,將飛機型號輸入,隨便選擇兩項中的一項。

查看2024年8月份的航班。

一直翻到8月18號,只有4個航班,但是滿足下午2點半這個時間還在飛的只有MU5156這一航班。

剩下的就是找途徑的地級市了。一開始我根據航線將其附近的地級市都試了一遍,結果都不對。下載航班管家,首頁->航班動態,搜索MU5156,查看飛行成就。

找到了北京飛往上海的航線圖,將中間的幾個城市試一下,得到結果為濟寧市。

故flag為:flag{MU5156_濟寧市}
Week4-Misc雜項
Alt
鍵盤流量,用tshark命令提取數據。tshark -r keyboard.pcapng -T fields -e usbhid.data | sed '/^\s*$/d' > usbdata.txt得到數據。

利用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。

改后綴,但是在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即可。

每個圖片都是二維碼的四分之一,拼完整如下。

掃描二維碼沒有內容,經過豆包查詢知道這是阿茲特克碼。

利用在線 AZTEC 二維碼閱讀器讀取。

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.zip和hint.txt。

提示是明文攻擊,看到114514.zip中的hint.txt和0721.zip中的hint.txtcrc值一致,可以確認是明文攻擊。

將解壓出來的hint.txt使用bindzip壓縮成一個新的壓縮包,確保壓縮方法一致。

使用Advanced Archive Password Recovery軟件利用明文攻擊。

如果長時間沒有解出來,就停止,也能得到解壓后的壓縮包flag.zip。

這些文件都很大,是個壓縮包炸彈,利用HxD打開,拉到最下面,可看到base64編碼的字符串。

將中間的.去掉,解碼。

看到504b0304就知道是個壓縮包,將數據復制到HxD中保存為111.zip。

解壓需要密碼,又看到最后一句話what the fuck i can not see the passwdf4tj4oGMRuI=,對f4tj4oGMRuI=base64解碼,全是不可見字符。

只能利用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。

浙公網安備 33010602011771號