浙江省2023ctf初赛复现

发布时间 2023-11-10 18:05:41作者: Jinx8823

misc

yuanshen

用010打开

image-20231110110346716

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

image-20231110111006672

发现每两位十六机制位都调转了位置

写个脚本将它逆转回来

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对这段代码的解释

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

还原出来是下面这样一张图片

image-20231110155112444

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

image-20231110160509492

image-20231110160527307

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

image-20231110160642866

stegseek安装地址:

Releases · RickdeJager/stegseek (github.com)

安装步骤:

1.先更新一下

sudo apt update

2.安装steghide依赖

sudo apt install steghide

3.到上述网站下载.deb文件

image-20231110160923010

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的解释:

  1. result='': 创建一个空字符串 result,用于存储最终的处理结果。
  2. filename="flag.txt": 指定要打开的文件名为 "flag.txt"。
  3. with open(filename) as file:: 使用 with 语句打开文件 "flag.txt",在这个语句块内对文件进行操作,确保在离开语句块时文件被正确关闭。
  4. for line in file:: 对文件中的每一行进行迭代。
  5. line=line.replace('=?','').replace('/','//'): 对每一行的内容进行处理,使用 replace 方法将字符串中的部分内容替换。具体地说,将所有的 '=?' 替换为空字符串,将所有的 '/' 替换为 '//'。
  6. result+=str(chr(eval(line))): 对处理后的每一行内容进行求值(使用 eval 函数),然后将结果转换为字符(使用 chr 函数),再转换为字符串,并添加到 result 中。这里使用 eval 来执行字符串中的表达式。
  7. print(result): 打印最终的处理结果。

直接写脚本得出flag

image-20231110165558525