moectf2023-misc复现


Misc 入门指北

题目描述:

1
来看看最基础的入门知识吧!

PDF文档里有base编码,赛博厨子一把梭

最后flag为

1
moectf{h@v3_fun_@t_m15c_!}

打不开的图片1

题目描述:

1
青青发了一张西电的风景图,但是怎么打不开

010修改文件头

补充后保存,并将后缀改为JPG

查看图片属性

赛博厨子一把梭

最后flag为

1
moectf{XDU_i5_v3ry_6e@u2ifu1}

打不开的图片2

题目描述:

1
青青又发了一张图片,但是怎么牛头不对马嘴

修改PNG文件头

修改后保存并更改后缀

最后flag为

1
moectf{D0_yOu_1ik3_Bo7@ck_?}

狗子(1) 普通的猫

题目描述:

1
2
3
[The Magical Cat Ep.1] 对,你没有听错。狗子是一只猫。 Rx 兴致勃勃地把他新养的猫的叫声发给了我们。为表情谊,Rx 也把 Flag 放在文件里,送给了我们。 (The Magical Cat 是一套带剧情(?)的系列题,包含六道难度循序渐进的 Misc 题目。)

提示:flag 被直接放在了文件里,但是该怎么找到它呢?也许一个 Hex 编辑器(例如 010 Editor 或 ImHex)能够帮到你。

010查看文件得到flag

最后flag为

1
moectf{eeeez_f1ag_as_A_G1ft!}

building near lake

题目描述:

1
一位群友在群里发了一张照片,细心的可可发现,他的照片居然发了原图!这不得找出他的坐标,给他一点小小的警告?

开启环境

百度识图得到

1
厦门大学翔安校区德旺图书馆

查询经纬度

1
118.310,24.610

查看图片属性

百度搜索照相机型号发现是Redmi k60,搜索发布时间是2022年12月27日

提交答案

最后flag为

1
moectf{P0sT_Y0uR_Ph0T0_wiTh_0Riginal_File_is_n0T_a_g00d_idea_YlJf!M3rux}

尊嘟假嘟?

题目描述:

1
嘟嘟嘟

尊嘟假嘟解密

1
2
3
4
5
6
cipher: rY5Ah8BtsYYatLEPu8YCPU22Gr5PQt8YGDKkvb4bk3D4JJeEe5kgCpoEqgRzsM7m9d8jEtE3LUoKpULQnMcuAunU1gtpzC5kSUxFctFTNCMZVHLHZNCo5akzKMRY5bbyBP7RNUeGDEYoUc
key: the tailing 8 bytes of hash of "zundujiadu?" which begin with b6091904cdfb
iv: the end 8 bytes of hash of "dududu?" which begin with 272bf1da2207

hint1: how do Bitcoin addresses encode?
hint2: the name of cryptosystem is "bl****sh"

先对key和iv进行SHA2加密

得到

1
2
key:57e55c126f1557b3
iv:67e9fca0871f9834

先base58解密再Blowfish Decrypt解码最后base64解密,赛博厨子一把梭

最后flag为

1
moectf{wow_you_aRe_the_masteR_of_Zundujiadu_92WPIBung92WPIBung9?WPIBung}

烫烫烫

题目描述:

1
锟斤拷锟斤拷锟斤拷

utf-7解密

1
2
3
4
5
6
7
这是你的flag:

a9736d8ad21107398b73324694cbcd11f66e3befe67016def21dcaa9ab143bc4405be596245361f98db6a0047b4be78ede40864eb988d8a4999cdcb31592fd42c7b73df3b492403c9a379a9ff5e81262

但是flag用AES加密了,key是下面这行字的sha256(hash值的开头是b34edc782d68fda34dc23329)

所以说,codepage真的很重要啊(

对“所以说,codepage真的很重要啊(”进行sha256加密

1
b34edc782d68fda34dc2332967273b0f0900a0ebd0dcec48467851bc6117bad1

AES解密,赛博厨子一把梭

最后flag为

1
moectf{codep@ge_pl@ys_@n_iMport@nt_role_in_intern@tion@liz@tion_g92WPIB}

狗子(2) 照片

题目描述:

1
2
3
[The Magical Cat Ep.2] 这只猫肯定在这照片里留了点东西。 我们前往了 Rx 家,见到了狗子,并拍到了他的珍贵照片。可是按下快门的下一刻,我们都察觉了一丝不对劲。 Rx 提出了一个可能性——狗子在拍照的一瞬间往图片 隐写 了信息。一开始只是玩笑话,可是可可检验了自己手上的照片,发现真的有隐藏的内容。 没人知道一只猫是怎么做到这件事的。但或许有另一种可能……这是后话。

提示:去寻找图片隐写的相关资料吧!这类工具非常多,所以一个个试试看吧。 提示2:“不是,你看看这图片上的字?Hacked by Doggy……所以狗子能够篡改图片的像素点?啊?” 提示3:本图片采用的是 LSB 隐写方式,但是明显并不常规,某个常用工具可能无法做出,需要各位自行寻找可用的工具

赛博厨子一把梭

最后flag为

1
moectf{D0ggy_H1dd3n_1n_Pho7o_With_LSB!}

base乐队

题目描述:

1
青青决定组建一只乐队,但是来的只有山田凉,怎么回事呢

赛博厨子一把梭

随波逐流一把梭

赛博厨子一把梭

最后flag为

1
moectf{Th4_6@nd_1nc1ud45_F3nc4_@nd_b@s3}

奇怪的压缩包

题目描述:

1
或许他不是个压缩包?

改后缀.ppt打开

flag1

flag2

flag3

flag4

最后flag为

1
moectf{2ip_?_n0_i4_pp4x!}

机位查询

题目描述:

1
青青在网上看到几个大师拍的城市风光很羡慕,也想去拍同款,你可以帮他找到这几张照片是在哪拍的吗 找出三张照片分别是在哪栋楼拍摄的,flag为1.2.3三张照片拍摄点的前两个字的拼音,三个拍摄点之间用_隔开 如:若找到的拍摄点分别为“世界之窗”“未来之瞳”“帝王大厦”,则flag为moectf{shijie_weilai_diwang}

照片1

百度地图搜索南宁站

1
嘉士摩根国际

照片2

搜索中山路美食街

1
百盛步行街广场

照片3

直接放进magic exif一把梭

1
汇金苑

最后flag为

1
moectf{jiashi_baisheng_huijin}

狗子(3) 寝室

题目描述:

1
[The Magical Cat Ep.3] 这只猫在沙发底下睡觉的时候,Rx应该不会想到,狗子身外的无数层屏障壁,正如同套娃一样,将他与宇宙另一侧的喧嚣隔绝开来。战争在那里打响,而战争的幸存者,正躲在沙发和一层层守护之下。

压缩包套娃

exp:

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
import os
import tarfile
import zipfile
import py7zr
while 1:
# 定义文件夹路径
folder_path = "D:\\tmp\\moectf2023\\tw\\"

# 获取文件夹下的所有文件名
file_names = os.listdir(folder_path)
# print(file_names[0])
# print(type(file_names[0]))

# 定义 tar.gz 文件路径
filename = folder_path+"/"+file_names[0]
# print(filename)
if filename.endswith(".tar.gz"):
# 创建 TarFile 对象
tar = tarfile.open(filename, "r:gz")
# 解压文件
tar.extractall(folder_path+"/")
# 关闭 TarFile 对象
tar.close()
os.remove(filename)
print(f"{filename} 解压完成。")
elif filename.endswith(".zip"):
# 创建 ZipFile 对象
zip_ref = zipfile.ZipFile(filename, 'r')
# 解压文件
zip_ref.extractall(folder_path+"/")
# 关闭 ZipFile 对象
zip_ref.close()
os.remove(filename)
print(f"{filename} 解压完成。")
elif filename.endswith(".7z"):
# 创建 7z 文件对象
with py7zr.SevenZipFile(filename, mode='r') as z:
# 解压文件到指定路径
z.extractall(folder_path+"/")
print(f"{filename} 解压完成")
os.remove(filename)
else:break

运行得到

最后flag为

1
moectf{Ca7_s133p1ng_und3r_zip_5hell5}

照片冲洗

题目描述:

1
青青在给照片加水印的时候不小心把两张照片粘在一起了,你有什么头绪吗 flag以moectf{}形式提交

010发现文件藏着另一张png文件

其分离出来并补充文件头

分离出来发现两张图片一模一样,双图频域盲水印攻击

最后flag为

1
moectf{W0w_you_6@v3_1earn3d_blind_w@t3rma2k}

狗子(4) 故乡话

题目描述:

1
[The Magical Cat Ep.4] 这只猫在刨他的猫砂。Rx 很头疼,因为他的排泄物随着细砂扬了一地。但是狗子不在乎。在飞溅这些猫砂的时候,他谱写的的是他的故乡。 提示:狗子所用的语言,似乎在地球上某款知名沙盒游戏也出现过…… 注意:最终得到的内容为纯英文小写字母,请使用 moectf{} 包裹,例如 moectf{answer}。

画图

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import cv2
import numpy as np
import os
import re

def text_to_image(input_text_path, output_image_path):
"""
将文本文件还原成图片
:param input_text_path: 输入的文本文件路径
:param output_image_path: 输出的图片路径
"""
# 读取文本文件
with open(input_text_path, 'r') as f:
lines = f.readlines()

# 解析文本内容
image_data = []
for line in lines:
# 移除行尾换行符
line = line.strip()
if not line:
continue

# 将文本行分割为布尔值列表
bool_list = []
for item in line.split():
# 处理不同的布尔值表示方式
if item.lower() in ['true', '1', 't']:
bool_list.append(True)
elif item.lower() in ['false', '0', 'f']:
bool_list.append(False)
else:
# 尝试解析为整数
try:
bool_list.append(int(item) > 0)
except ValueError:
# 无法解析则默认为False
bool_list.append(False)

image_data.append(bool_list)

# 检查数据有效性
if not image_data:
print("错误:文本文件中没有有效数据")
return

# 创建图像数组
height = len(image_data)
width = len(image_data[0])

# 创建三通道图像(黑色对应True,白色对应False)
img = np.zeros((height, width, 3), dtype=np.uint8)

for y, row in enumerate(image_data):
for x, value in enumerate(row):
if value:
# True: 黑色 (0,0,0)
img[y, x] = [0, 0, 0]
else:
# False: 白色 (255,255,255)
img[y, x] = [255, 255, 255]

# 保存图像
cv2.imwrite(output_image_path, img)
print(f"图片已成功保存至: {output_image_path}")
return img

def process_directory(input_dir, output_dir):
"""
处理目录中的所有文本文件
:param input_dir: 输入目录(包含文本文件)
:param output_dir: 输出目录(保存图片)
"""
# 确保输出目录存在
os.makedirs(output_dir, exist_ok=True)

# 遍历输入目录
for filename in os.listdir(input_dir):
if filename.endswith(".txt"):
input_path = os.path.join(input_dir, filename)
# 创建对应的输出文件名(替换扩展名为.png)
output_filename = re.sub(r'\.txt$', '.png', filename)
output_path = os.path.join(output_dir, output_filename)

print(f"处理文件: {input_path} -> {output_path}")
text_to_image(input_path, output_path)

if __name__ == "__main__":
# 单个文件处理示例
input_text = "D:\\tmp\\attachment.txt"
output_image = "D:\\tmp\\restored_image.png"

# 处理单个文件
text_to_image(input_text, output_image)

# 批量处理目录示例
# input_directory = "D:\\tmp\\text_files"
# output_directory = "D:\\tmp\\restored_images"
# process_directory(input_directory, output_directory)

运行得到

标准银河字母表对照

标准银河字母_百度百科

最后flag为

1
moectf{dontanswer}

magnet_network

题目描述:

1
注:本题暂时无hint,不建议新手尝试

exp:

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
from hashlib import sha1
import itertools

d = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@!_?'
c = '''3A CA D9 6E E5 35 45 F8 AD 3C 41 9C 5B 19 65 BE
A2 34 CC 6A B3 39 E2 54 7E 1B B5 C1 E5 6C 2A CE
AB 1F 7C F5 AF 93 D1 3D 65 13 1D BA 75 0F DC B7
15 E3 23 51 07 04 1D E9 C7 96 71 AE D3 BA 65 3B
9D 29 54 4B 62 39 02 AA 07 07 44 92 79 3C 7A D4
4D D6 E8 92 D9 25 A7 41 1C B1 67 7B 8B 5D 8F EC
6D 93 08 AC CC 83 04 7E 9A E3 92 E0 2B 50 44 28
3C 89 F1 6D C2 6F 32 8E'''.replace(' ','').replace('\n','').lower()

results = [None] * 6 # 存储找到的6个字符串

for j in range(6):
cc = c[j*40:j*40+40]
print(f"\nSearching for hash {j}: {cc}")
count = 0
found = False
for chars in itertools.product(d, repeat=4):
count += 1
if count % 1000000 == 0:
print(f" Progress: {count} combinations checked")
s_str = ''.join(chars)
if j == 5:
if sha1(s_str.encode()).hexdigest() == cc:
print(f"Found: {s_str}")
results[j] = s_str
found = True
break
else:
data = s_str.encode() + b'\x00'*16380
if sha1(data).hexdigest() == cc:
print(f"Found: {s_str}")
results[j] = s_str
found = True
break
if not found:
print(f"Not found for hash {j}!")

# 拼接找到的所有字符串形成flag
if all(res is not None for res in results):
flag = "moectf{" + "_".join(results) + "}"
print("\nFlag found:", flag)
else:
print("\nCould not find all parts for the flag.")

运行得到

最后flag为

1
moectf{p2p_iS_intereSting_2WPIB}

weird_package

题目描述:

1
“你在我的压缩包里面做了什么” “没...没有啊”(心虚

修复压缩包解压

尝试到最后一个9999数据有用,赛博厨子一把梭

最后flag为

1
moectf{WHaT_DiD_You_Do_To_THe_arcHive?_!lP0iYlJf!M3rux9G9Vf!JoxiMl903ll}

你想要flag吗

题目描述:

1
青青向littlebean索要flag,但是littlebean只给他发了一段音频让他自己想办法,你能帮帮青青吗

查看音频频谱

steghide隐写 密码是youseeme

rabbit解密

最后flag为

1
moectf{Mu5ic_1s_v3ry_1nt23esting_!}

狗子(5) 毛线球

题目描述:

1
[The Magical Cat Ep.5] 这只猫终于还是带着玩具毛线球跑路了。 他要跑去哪里?除了毛线球,他又带走了什么? 你派出了你的猫(cat),去追踪狗子的踪迹。 (请通过 WSRX 转发题目后使用 nc 连接本题。)

查看源码

1
2
3
4
5
6
随机 100~1000 次运行 /bin/true
如果命令行传递进的参数不被”隐藏“,则:
设置一个值为参数的环境变量
执行自身,”隐藏“参数
自身结束执行
如果命令行传递进的参数是”隐藏“的,则等待 300s 后退出,答题者必须重启环境。

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
import pwn

r = pwn.connect("192.168.0.115",3519)

r.recvuntil(b"(yourcat)")
for i in range(100, 1100):
print(f"trying pid {i}")
r.sendline(f"cat /proc/{i}/environ")
recv = r.recvuntil("(yourcat)").decode()
if "CATSFLAG" in recv:
print(recv)
break
r.close()

运行得到

最后flag为

1
flag{WhY-@R3_You_plaYINg_HaRuhlK4ge194fee2}

狗子(6) 星尘之猫

题目描述:

1
[The Magical Cat Ep.6] 对,你没有听错。狗子是一只来自宇宙的猫。 追查“毛线球”的过程中,狗子的身份已不言自明。他通过隐藏在房间中的超空间传送门返回了他的世界,而现在我们的当务之急,是找到 Flag,逃脱这个名为 pyjail 的是非之地。 请解出来的师傅私聊出题人@可可今天吃什么 对一下答案 (题目地址:nc cl.akarin.tk 10001)

源码

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
52
53
54
55
56
57
58
59
import re
import socketserver

class Task(socketserver.BaseRequestHandler):
def _recvall(self):
BUFF_SIZE = 2048
data = b''
while True:
part = self.request.recv(BUFF_SIZE)
data += part
if len(part) < BUFF_SIZE:
break
return data.strip()

def send(self, msg:str, newline=True):
try:
msg = msg.encode()
if newline:
msg += b'\n'
self.request.sendall(msg)
except:
pass

def recv(self, prompt=b'[-] '):
self.send(prompt, newline=False)
line = self._recvall().decode()
if len(line) == 0:
raise KeyboardInterrupt
return line

def handle(self):
flag = "moectf{this_is_not_the_real_flag_and_the_real_one_is_'flag.txt'}"
pattern = re.compile(r"(?:read)|(?:pattern)|(?:write)|(?:dir)|(?:vars)|(?:locals)|(?:globals)|(?:attr)|(?:sys)|(?:import)|(?:eval)|(?:exec)|(?:input)|(?:os)|(?:help)|(?:breakpoint)|(?:[\.\\_=])|[^\x00-\xff]")
while True:
try:
s = self.recv(">> ")
if len(s) > 35 or pattern.search(s):
self.send("<< [ === ACCESS DENIED === ]")
continue
self.send(f"<< {eval(s)}")
except KeyboardInterrupt:
break
except:
self.send("<< [ === !!!ERROR!!! === ]")


class ForkedServer(socketserver.ForkingMixIn, socketserver.TCPServer):
pass

if __name__ == "__main__":
try:
HOST, PORT = '0.0.0.0', 9999
print("HOST:POST " + HOST+":" + str(PORT))
server = ForkedServer((HOST, PORT), Task)
server.allow_reuse_address = True
server.serve_forever()
except KeyboardInterrupt:
server.server_close()
pass

发现flag在flag.txt里面,并且可以open,但是不能read,绕过read函数读取文件内容即可 payload:

1
[*open("flag"+chr(46)+"txt")]

文章作者: yiqing
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 yiqing !
  目录