浙江省2023ctf初赛复现
misc
yuanshen
用010打开

一张正常的jpg图片开头应该是像下面这张图一样

发现每两位十六机制位都调转了位置
写个脚本将它逆转回来
with open('yuanshen','rb') as file1:
with open('1.jpg','wb') as file2:
hex_list=("{:02X}".format(int(c)) for c in file1.read())
for i in hex_list:
file2.write(bytes.fromhex(i[::-1]))
以下是chatgpt对这段代码的解释
with open('yuanshen', 'rb') as file1:: 打开名为 "yuanshen" 的文件,以二进制只读模式打开 ('rb'表示二进制模式读取文件)。使用with语句确保在文件使用完毕后正确关闭。with open('1.jpg', 'wb') as file2:: 打开一个新文件 "1.jpg",以二进制写模式打开 ('wb'表示二进制模式写文件)。同样,使用with语句确保在文件使用完毕后正确关闭。hex_list=("{:02X}".format(int(c)) for c in file1.read()): 读取 "yuanshen" 文件的内容,将每个字节转换为十六进制字符串,并存储在生成器表达式hex_list中。每个字节的十六进制表示通过"{:02X}".format(int(c))实现,其中int(c)将每个字节字符转换为整数,然后"{:02X}"将整数格式化为两位的十六进制字符串。for i in hex_list:: 对hex_list中的每个元素(即每个字节的十六进制表示)进行迭代。file2.write(bytes.fromhex(i[::-1])): 将反转后的十六进制字符串i[::-1]转换为字节对象,并将该字节对象写入 "1.jpg" 文件。bytes.fromhex将十六进制字符串转换为字节对象,[::-1]是用来反转字符串的切片操作。
还原出来是下面这样一张图片

看了一下其他人的wp发现是用stegseek


DASH有‘破折号’的意思,DOT有‘点’的意思,所以猜测应该是摩斯密码,再HEX转换一下得到结果

stegseek安装地址:
Releases · RickdeJager/stegseek (github.com)
安装步骤:
1.先更新一下
sudo apt update2.安装steghide依赖
sudo apt install steghide3.到上述网站下载.deb文件
4.安装
sudo apt install ./stegseek_0.6-1.deb
crypto
小小数学家
result=''
filename="flag.txt"
with open(filename) as file:
for line in file:
line=line.replace('=?','').replace('/','//')
result+=str(chr(eval(line)))
print(result)
chatgpt的解释:
result='': 创建一个空字符串result,用于存储最终的处理结果。filename="flag.txt": 指定要打开的文件名为 "flag.txt"。with open(filename) as file:: 使用with语句打开文件 "flag.txt",在这个语句块内对文件进行操作,确保在离开语句块时文件被正确关闭。for line in file:: 对文件中的每一行进行迭代。line=line.replace('=?','').replace('/','//'): 对每一行的内容进行处理,使用replace方法将字符串中的部分内容替换。具体地说,将所有的 '=?' 替换为空字符串,将所有的 '/' 替换为 '//'。result+=str(chr(eval(line))): 对处理后的每一行内容进行求值(使用eval函数),然后将结果转换为字符(使用chr函数),再转换为字符串,并添加到result中。这里使用eval来执行字符串中的表达式。print(result): 打印最终的处理结果。
直接写脚本得出flag



浙公网安备 33010602011771号