Bugku Misc Write Up (1-30)

1. 签到题

扫码关注

flag
1
flag{BugKu-Sec-pwn!}

2. 这是一张单纯的图片

随波逐流打开图片分析得到

1
2
文件中包含key的Unicode码: 
key{you are right}

然后 Unicode 转 Ascii

flag
1
key{you are right}

3. 隐写

随波逐流打开图片分析发现图片宽度和高度被修改过,打开修复后的图片即可

flag
1
BUGKU{a1e5aSA}

4. telnet

随波逐流秒了

flag
1
flag{d316759c281bf925d600be698a4973d5}

5. 眼见非实

docx 后缀改成 zip 然后打开

打开 word 目录下的 document.xml,搜索 flag

flag
1
flag{F1@g}

6. 啊哒

binwalk 提取出一个压缩包,发现解压需要密码

然后查看图片属性发现可疑信息照相机型号 73646E6973635F32303138,尝试拿这个当密码解压缩包结果失败了

接着把这串字符丢随波逐流 base16 解码后得到了 sdnisc_2018,再次尝试成功解压拿到 flag

flag
1
flag{3XiF_iNf0rM@ti0n}

7. 又一张图片,还单纯吗

binwalk 提取失败了,用 foremost 提取得到两张图片,其中一张图片上面就是 flag

flag
1
falg{NSCTF_e6532a34928a3d1dadd0b049d5a3cc57}

8. 猜

拖到百度搜图就出来了,刘亦菲

flag
1
key{liuyifei}

9. 宽带信息泄露

RouterPassView 打开 conf.bin,搜索 username

flag
1
flag{053700357621}

10. 隐写 2

binwalk 提取拿到 flag.rar提示.jpg(其实这不是一个 rar 文件,而是一个 zip 文件)

压缩包需要密码,再看图片知道这就是压缩包密码的提示

密码只有 3 个数字典爆破秒了(bushi) 附上源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import zipfile
import zlib

# 打开zip文件
with zipfile.ZipFile('flag.zip') as zf:
# 尝试所有的三位数密码
for i in range(1000):
password = f"{i:03d}".encode() # 创建三位数的字符串并转换为字节类型
print(f"尝试密码: {password.decode()}") # 解码为字符串
try:
zf.extractall(pwd=password)
print(f"找到正确密码: {password.decode()}")
break
except RuntimeError as e:
# 如果不是正确的密码,会抛出RuntimeError异常
if 'Bad password' in str(e):
continue
else:
print(f"密码 {password.decode()} 导致错误: {str(e)}")
except zlib.error as e:
print(f"密码 {password.decode()} 导致解压缩错误: {str(e)}")
else:
print("未找到正确的密码")

把文件名改回 flag.zip 然后运行代码得到找到正确密码: 871

后来在评论区看到了似乎是合理的解释:观察电脑键盘 KQJ 的上面对应数字,分别对应 817,根据提示斗地主,国王与卫兵显然是一队,国王最大国王赢则卫兵赢,推出密码为 871。然而本人不会打斗地主,让我想再久也想不出来的 (摊手)

解压拿到的图片丢随波逐流发现 Jpg文件结束标志[FF D9]后信息:f1@g{eTB1IEFyZSBhIGhAY2tlciE=}

,接着 eTB1IEFyZSBhIGhAY2tlciE=base64 解码得到 y0u Are a h@cker!

flag
1
f1@g{y0u Are a h@cker!}

11. 多种方法解决

随波逐流秒了。文件中包含 data:image/jpg;base64 图片,转成图片后扫码即可。

flag
1
KEY{dca57f966e4e4e31fd5b15417da63269}

12. 闪的好快

masterGO.gif 里面有若干帧,每一帧都是一个二维码。写一个脚本,逐帧扫描二维码,然后把二维码里的内容存到列表里,最后把列表里的内容合并起来输出就好了。附上脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import imageio
from PIL import Image
from pyzbar.pyzbar import decode

def extract_qr_data_from_gif(gif_path):
gif = imageio.get_reader(gif_path)
qr_data_list = []

for frame in gif:
pil_image = Image.fromarray(frame)

decoded_objects = decode(pil_image)
for obj in decoded_objects:
qr_data_list.append(obj.data.decode('utf-8'))

unique_qr_data = list(dict.fromkeys(qr_data_list))
combined_data = ''.join(unique_qr_data)

return combined_data

gif_file_path = 'masterGO.gif'
combined_qr_data = extract_qr_data_from_gif(gif_file_path)
print(combined_qr_data)

运行脚本得到 flag

flag
1
SYC{F1ah_sof4T}

13. come_game

运行游戏,在游戏目录下发现存档文件 save1,用十六进制编辑器打开存档,把 32 改为 35 就可以跳关了。保存之后再次打开游戏加载存档得到 flag

flag
1
SYC{6E23F259D98DF153}

14. 白哥的鸽子

丢到随波逐流发现 Jpg文件结束标志[FF D9]后信息:fg2ivyo}l{2s3_o@aw__rcl@。栅栏密码解密,分为三栏时得到 flag{w22_is_v3ry_cool}@@

flag
1
flag{w22_is_v3ry_cool}

15. linux

随波逐流秒了,文件中包含 { } 符号。用记事本打开直接搜索 key{也能很轻易地搜出来。

flag
1
key{feb81d3834e2423c9903f4755464060b}

16. 隐写 3

随波逐流打开图片分析发现图片宽度和高度被修改过,打开修复后的图片即可

flag
1
flag{He1l0_d4_ba1}

17. 做个游戏

当作压缩包解压了。用随波逐流打开 heiheihei\cn\bjsxt\plane\PlaneGameFrame.class 就可以找到 flag{RGFqaURhbGlfSmlud2FuQ2hpamk=}RGFqaURhbGlfSmlud2FuQ2hpamk=base64 解码得到 DajiDali_JinwanChiji

flag
1
flag{DajiDali_JinwanChiji}

18. 想蹭网先解开密码

根据题目提示写个字典先

1
2
3
4
with open('dict.txt', 'w') as file:
for i in range(10000):
line = f"1391040{i:04d}\n"
file.write(line)

把下载的.cap 文件放到这里 cap2hashcat 转换得到一个.hc22000 文件

然后在 hashca 官网下载编译好的二进制文件

然后把字典和转换后的文件放到 hashcat 所在目录下,并在该目录下运行命令 hashcat.exe -m 22000 1342505_1733548984.hc22000 dict.txt --force

很快就解出来了

flag
1
flag{13910407686}

19. Linux2

随波逐流秒了

flag
1
KEY{24f3627a86fc740a7f36ee2c7a1c124a}

20. 细心的大象

binwalk 提取出一个 rar 压缩包,发现里面有一场图片 2.png,解压需要密码

原图片 1.jpg 属性的备注藏了东西 TVNEUzQ1NkFTRDEyM3p6

用 base64 解码得到压缩包密码 MSDS456ASD123zz

随波逐流打开解压拿到的 2.png 分析发现图片宽度和高度被修改过,打开修复后的图片即可(后半部分和这题一模一样)

flag
1
BUGKU{a1e5aSA}

21. 爆照

binwalk 提取出一个压缩包,解压了发现一张动图和好多个没有后缀的文件

随波逐流打开发现都是 jpg 格式的,还原一下,发现 88.jpg 藏了一个二维码,扫码结果是 bilibili

888.jpg 属性里面藏了一串 base64 编码后的字符串 c2lsaXNpbGk=,解码得到 silisili

8888.jpgbinwalk 一下出来一个压缩包,扫一下里面的二维码得到 panama

上面根据题目要求按顺序连起来就得到 flag 了

flag
1
flag{bilibili_silisili_panama}

22. 猫片 (安恒)

看提示先考虑 LSB 隐写。又根据提示,考虑顺序 BGR,不出所料地得到了一张 png 图片,保存成二进制文件然后用 foremost 分离出来发现了是半张二维码

丢到随波逐流发现图片宽度和高度被修改过,还原出完整的二维码,扫码得到百度网盘链接,下载解压 (此处必须用 WinRAR 解压,否则后面没法扫出隐藏的文件) 后里面的内容是 flag不在这里哦 你猜猜flag在哪里呢? 找找看吧

刚开始我还以为会是零宽字符隐写,但是拿去解密了发现不是,文件属性也没有信息,看来 flag 确实不在这。此时我想起来提示还有一个信息 NTFS 没用上,这是一道关于 NTFS 交换数据流的题

NtfsStreamsEditor 扫描出.pyc 文件,执行命令 uncompyle6.exe flag.pyc >flag.py 用 uncompyle6 反编译(需要 pip 安装 pip install uncompyle6

我反编译得到的内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import base64

def encode():
flag = '*************'
ciphertext = []
for i in range(len(flag)):
s = chr(i ^ ord(flag[i]))
if i % 2 == 0:
s = ord(s) + 10
else:
s = ord(s) - 10
ciphertext.append(str(s))

return ciphertext[::-1]


ciphertext = [
3, 4, 5, 6, 7, 8, 9, 5, 10, 11, 12, 13, 14, 15, 16, 8, 17, 18,
19, 20, 21, 22, 23, 15]

这里的 ciphertext 就是上面的 encode 函数编码得来的,只要根据原来的函数写一个解码的函数就好了。(注:不知道为什么上面反编译得到的 ciphertext 是错误的。下面的 ciphertext 来自网络,代码是没问题的,看看得了😓)

附上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ciphertext = [
'96', '65', '93', '123', '91', '97', '22', '93', '70', '102', '94', '132', '46', '112', '64', '97', '88', '80', '82', '137', '90', '109', '99', '112']

def decode(ciphertext):
reversed_ciphertext = [int(x) for x in ciphertext[::-1]]

flag = ''
for i, num in enumerate(reversed_ciphertext):
if i % 2 == 0:
num -= 10
else:
num += 10

original_char = chr(num ^ i)
flag += original_char

return flag

print(decode(ciphertext))

运行得到 flag

flag
1
flag{Y@e_Cl3veR_C1Ever!}

23. 多彩

LSB 隐写 BGR 发现压缩包,先用 binwalk 把压缩包提取出来,发现解压需要密码

然后回到开始那张图片,用 StegSolve 打开,在 Red plane 0 发现法国奢侈品品牌 YSL 的商标,根据这些猜测这张图上面的是口红的色卡(?

于是先找了个网站,把图片丢进去,按顺序记录下每个颜色的的 HEX 值 #bc0b28 #d04179 #d47a6f #c2696f #eb8262 #cf1a77 #c0083e #bc0b28 #bc0b28 #d13274 #691319 #bc0b28 #bc0b28 #d4121d #d75b59 #dd8885 #dd8885 #dd8885 #7e453a #7e453a #7e453a

密码就是每个颜色的 YSL 对应口红色号的二进制转字符串 (脑洞太大了没想出来,看了网友的 wp 才知道这题来自 n1ctf-2018,贴个官方题解)。网上给的口红链接好像大多都失效了,我在这里贴一个目前能访问的

按照这个思路就可以得到色号 1,27,59,11,23,7,57,1,1,76,222,1,1,50,214,6,77,50,53,214,6,根据上面的思路可以接出来密码是白学家

最后解压缩拿到 flag

flag
1
flag{White_Album_is_Really_worth_watching_on_White_Valentine's_Day}

24. 旋转跳跃

题目给的是一个.mp3 文件,再看提示 key:syclovergeek,所以猜测是 mp3stego 隐写,密钥就是 syclovergeek

flag
1
SYC{Mp3_B15b1uBiu_W0W}

25. 普通的二维码

扫码得到一串乱码的东西 ¹þ¹þ!¾Í²»¸æËßÄãflag¾ÍÔÚÕâÀï!,改用 GBK 编码得到哈哈!就不告诉你flag就在这里!😓

记事本打开划到底发现了一串神秘数字 146154141147173110141166145137171060125137120171137163143162151160164137117164143137124157137124145156137101163143151151041175,用随波逐流发现是八进制转字符,直接就出来了

flag
1
flag{Have_y0U_Py_script_Otc_To_Ten_Ascii!}

26. 乌云邀请码

随波逐流秒了

LSB 隐写,顺序是 BGR

flag
1
flag{Png_Lsb_Y0u_K0nw!}

27. 神秘的文件

解法 1: 丢进随波逐流字典爆破出来了,密码是 q1w2e3r4

拿到的.docx 后缀改成.zip,解压后在 docProps 目录下找到了 flag.txt,里面是 ZmxhZ3tkMGNYXzFzX3ppUF9maWxlfQ==,base64 解码就拿到 flag 了

解法 2: 压缩包里面的 logo.png 和提供的 logo.png 是一样的,可以用 ARCHPR 进行明文攻击

flag
1
flag{d0cX_1s_ziP_file}

28. 论剑

010Editor 打开图片,在中间发现了一长串二进制字符 01101101 01111001 01101110 01100001 01101101 01100101 01101001 01110011 01101011 01100101 01111001 00100001 00100001 00100001 01101000 01101000 01101000(第一步就没想到😥藏在中间谁想得到啊😰)。转成 ascii 码是 mynameiskey!!!hhh

这串二进制字符后面的编码 38 7B BC AF 27 1C 很像 7z 压缩包的文件头 37 7A BC AF 27 1C(这一步也没想到😭对文件头还不是很敏感),改一下然后保存

接着 binwalk 一下果然发现 7z 压缩包了

1
2
3
4
5
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 JPEG image data, JFIF standard 1.01
9591 0x2577 7-zip archive data, version 0.4
17569 0x44A1 JPEG image data, JFIF standard 1.01

丢 kali 里面用 dd 命令 dd if=file.jpg of=output.7z skip=9591 bs=1 提取(if 是输入文件,of 是输出文件,skip 是指定从输入文件开头跳过 9591 个块后再开始复制,对应 binwalk 输出的 DECIMAL,bs 设置每次读写块的大小为 1 字节),解压密码就是上面解出来的 mynameiskey!!!hhh

接下来分别改一下下载下来的 file.jpg 和提取出来的 ljc2.jpg 的高度,把第 00A0 行(也就是十进制的第 160 行)的第 3 个数和第 4 个数改成 00 7E

结合两张图片未被遮挡的部分可以得到 Not flag{666c61677B6D795F6E616D655F482121487D}hhhh

中间的 666c61677B6D795F6E616D655F482121487D 十六进制转 ascii 码解出来就是 flag 了

flag
1
flag{my_name_H!!H}

29. 图穷匕见

随波逐流打开,发现 Jpg文件结束标志[FF D9]1个后面包含其他信息,可能存在多个文件叠加隐写或后接文本隐写

得到了一大堆点的坐标

写个脚本还原一下(也可以把 txt 再丢回随波逐流用 X,Y坐标串转图片

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
from PIL import Image

def load_points_from_file(filename):
points = []
with open(filename, 'r') as file:
for line in file:
# 假设每个点坐标以这样的格式存在一行 "(x,y)",去除括号后拆分字符串
x, y = line.strip().strip('()').split(',')
points.append((int(x), int(y)))
return points

def create_image(points, image_size=(20, 20)):
# 创建一个白色背景的图像
img = Image.new('RGB', image_size, 'white')
pixels = img.load()

# 将所有给定的点设置为黑色
for point in points:
if 0 <= point[0] < image_size[0] and 0 <= point[1] < image_size[1]:
pixels[point[0], point[1]] = (0, 0, 0)

return img

def main():
# 加载点坐标
points = load_points_from_file('flag.txt')

# 确定图像大小,这里假设图像不会超过20x20像素
max_x = max([p[0] for p in points]) + 1
max_y = max([p[1] for p in points]) + 1
image_size = (max_x, max_y)

# 创建并保存图像
img = create_image(points, image_size)
img.save('output_image.png')
print("图像已成功生成并保存为 'output_image.png'.")

if __name__ == '__main__':
main()

得到了一张二维码的图片,扫一下 flag 就出来了

flag
1
flag{40fc0a979f759c8892f4dc045e28b820}

30. convert

全是 0 和 1,首先考虑二进制转 ascii 码。太长了随波逐流打不开于是丢到 CyberChef,发现开头是 Rar,保存为.rar 文件,解压就能发现一张图片

查看属性,发现主题藏了东西 ZmxhZ3swMWEyNWVhM2ZkNjM0OWM2ZTYzNWExZDAxOTZlNzVmYn0=,base64 解码就行了

flag
1
flag{01a25ea3fd6349c6e635a1d0196e75fb}