浙江省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 update
2.安装steghide依赖
sudo apt install steghide
3.到上述网站下载.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