HNCTF 刷题记录

652 词

1. Misc

1.1 UP&DOWN_Aussie

https://www.upsidedowntext.com/ 网站还原,找到关键代码

400

1
2
3
sim = „2rz4o1iHzajwMbPv5Lng4akWkY„;
mis = „a11kpfT7h9rEuWEtsZbykTv43„;
nis = „1L33ThtkE3EHepg5x8pEEG„;

拼接得到

1
2rz4o1iHzajwMbPv5Lng4akWkYa11kpfT7h9rEuWEtsZbykTv431L33ThtkE3EHepg5x8pEEG

根据提示把第2,23,30,45,47位改成大写,第31位爆破得D,解base58即可

1
2Rz4o1iHzajwMbPv5Lng4aKWkYa11KDfT7h9rEuWEtsZByKTv431L33ThtkE3EHepg5x8pEEG

NSSCTF{c0oL_u_f1NiSH_tHe_upsidedown_@nD_SeE_tHe_f1@g}

1.2 ex_word

一个word文档,打开后没有发现有价值的信息。后缀改成zip进行解压。在media文件夹下发现文件theme.png

文件不能正常打开,用010查看文件头,发现文件头是50 4B,是个zip文件
修改后缀后打开,发现flag.xml得到一串emoji

解码网站:http://www.atoolbox.net/Tool.php?Id=937

1.3 kiana

解法一:beyondcompare直接导入分析

解法二:python脚本

1
2
3
4
5
6
from PIL import Image
import numpy as np

a = Image.open("...")
b = Image.open("...")
Image.fromarray(np.array(a) ^ np.array(b)).show()

NSSCTF{come_and_play_bh3}

1.4 PDF && PNG

打开pdf文件看到一堆像素,用binwalk分离

1
binwalk -e flag.pdf

发现一个可疑文件

500

尝试每三个字节作为RGB进行绘图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
from PIL import Image
import binascii

def read_hex_file(file_path):
data_list = []
with open(file_path, 'rb') as f:
while True:
# 读取一个字节(即两个十六进制字符)并转换为整数
byte = f.read(1)
if not byte:
break
data = int(binascii.hexlify(byte), 16)
data_list.append(data)
return data_list

def solve(data_list):
x = 100
y = 100
im = Image.new('RGB', (x, y)) # 创建一张大小为 x*y 的 RGB 图片
s = data_list # 将输入的一维数据列表转换为二维像素矩阵

# 初始化变量
count = 0 # 记录当前处理的像素在 s 列表中的下标
length = 1 # 记录当前连续的像素颜色相同的数量
a = () # 记录上一个像素的颜色元组

# 遍历像素矩阵,将像素颜色信息存入图片,并输出解密结果
for i in range(y):
for j in range(x):
tmp = (s[count], s[count+1], s[count+2]) # 从 s 列表中读取下一个像素的颜色信息
im.putpixel((j, i), tmp) # 将像素颜色信息存入图片

# 判断当前像素颜色是否和上一个像素颜色相同
if a == tmp:
length += 1 # 像素颜色相同,更新连续相同像素的数量
else:
if length > 1: # 像素颜色不同,输出上一个颜色连续的次数并重置计数器
print(chr(length), end="")
length = 1

# 更新上一个像素颜色和下标
a = tmp
count += 3

# 如果已经处理完所有像素,保存图片并结束程序
if count == (len(s) // 3):
im.save('flag.png') # 可以不用生成图片
exit()

data_list = read_hex_file('300')
solve(data_list)

图片理论上用npiet可以解,但是不知道为啥解不出来

500

这里将连续相同颜色像素个数转为字符串得到

1
d1d_u_f1nd_Th1s_KEy_F1l3

用wbs43open 解密即可

NSSCTF{u_can_use_wbstego_and_find_flag}

calligraphy

Baldi’s Basics

Matryoshka