NepCTF2023_WP

比赛详情:misc(7/9), pwn(1/9)

已经从二进制手变成misc手了,悲

排名

misc-codes

题目提示flag在环境变量内,所以本题目的是:编写能获取并输出环境变量的C语言代码。

经过不断试错,发现getenv(),main(int argc, char* args[], char* envp[])等常用的方法均不能通过。

所以合理推测是把env这个词ban了,把main第三个参数名envp改成e就可以输出了

exp:

1
2
3
4
5
6
7
#include <stdio.h>
int main(int argc, char* args[], char* e[]) {
for (int i = 0; e[i] != NULL; ++i) {
printf("%s\n", e[i]);
}
return 0;
}
output

misc-与AI共舞的哈夫曼

给了一个经过哈夫曼压缩算法压缩后的文件,直接用copilot生成解压代码了(毕竟不是说与ai共舞嘛)

不过生成的有点问题,输出的解压文件是空的,手动改了一些

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
def decompress(input_file, output_file):
with open(input_file, 'rb') as f:
data = f.read()

# Read frequency information
frequencies = {}
num_of_freq = data[0]
index = 1
for _ in range(num_of_freq):
byte = data[index]
freq = (data[index+1] << 24) | (data[index+2] << 16) | (data[index+3] << 8) | data[index+4]
frequencies[byte] = freq
index += 5

root = build_huffman_tree(frequencies)

# Read compressed data
padding = data[index]
index += 1
dat = data[index:]

compressed_data = ''
for byte in dat:
byte = bin(byte)[2:].rjust(8, '0')
compressed_data += byte

#compressed_data = compressed_data[:-padding]

node_now = root
result = b''
for bit in compressed_data:
if bit == '0':
node_now = node_now.left
else:
node_now = node_now.right

if node_now.left is None and node_now.right is None:
result += bytes([node_now.char])
node_now = root

with open(output_file, 'wb') as f:
f.write(result)

huffman_decompressed

虽然还是有点问题,不过已经不妨碍得到结果了()

NepCTF{huffman_zip_666}

misc-ConnectedFive

万宁五子棋,不好评价(

直接玩过去就好了()

(不想再玩一次了,就不放截图了吧,42次也太多了)

misc-CheckIn

签到,题目给了flag

checkin

misc-陌生的语言

得到一个图片:

陌生的纸条

提示了题目中A同学是Atsuko Kagari,查了一下是《小魔女学园》的,显然图中的两种语言应该出自该作品。最后查找确定了上下分别是古代龙语和露娜文

在网上找到了对应的码表

龙语

luna_alphabet

分别得到了nepnep a believing,和heart is your magic

提示flag格式凭语法断句,然后大小写都试一下,得到flag是:

NepCTF{NEPNEP_A_BELIEVING_HEART_IS_YOUR_MAGIC}

misc-小叮弹钢琴

得到一个piano.mid文件,听了一会,发现可能有摩斯密码

用Audacity打开:

mose xor_data

发现一半是摩斯,另一半可以侧过来看是一个很大的16进制数,读出来结果如下:

-.–/—/..-/…/…./—/..-/.-../-../..-/…/./-/…./../…/-/—/-..-/—/.-./…/—/–/./-/…./../-./–.

0x370a05303c290e045005031c2b1858473a5f052117032c39230f005d1e17

把摩斯密码解密得到YOU SHOULD USE THIS TO XOR SOMETHING

显然要用这段英文xor刚才的16进制数

发现这个16进制数有30字节,摩斯密码明文也是30个字符(不算空格)

所以逐项异或得到答案(这里大小写都试了,小写可以)

1
2
3
4
5
6
7
8
9
a = '370a05303c290e045005031c2b1858473a5f052117032c39230f005d1e17'
xor = 'youshouldusethistoxorsomething'
xor_a = [int(a[i:i+2], 16) for i in range(0, len(a), 2)]

flag = ''
for i in range(len(xor_a)):
flag += chr(xor_a[i] ^ ord(xor[i]))

print(flag)

得到 NepCTF{h4ppy_p14N0}NepCTF{h4pp

misc-你也喜欢三月七么

得到的txt附件内容如下:

1
2
3
4
5
salt_lenth= 10 
key_lenth= 16
iv= 88219bdee9c396eca3c637c0ea436058 #原始iv转hex的值
ciphertext=
b700ae6d0cc979a4401f3dd440bf9703b292b57b6a16b79ade01af58025707fbc29941105d7f50f2657cf7eac735a800ecccdfd42bf6c6ce3b00c8734bf500c819e99e074f481dbece626ccc2f6e0562a81fe84e5dd9750f5a0bb7c20460577547d3255ba636402d6db8777e0c5a429d07a821bf7f9e0186e591dfcfb3bfedfc

显然是一个AES加密,这里肯定要先解出salt和key

image-20230813200653505

没什么头绪,所以回去重新看题,发现了一些端倪:

  • 这群名看起来怪怪的,…,好咸诶 => 推测出群名是盐,也就是salt=NepCTF2023
  • 这需要经过啥256处理一下才能得到解题的关键 => 啥的拼音是sha,所以推测要把salt用sha256加密,得到关键(合理推测就是key了)

得到sha256(salt)= dd8e671df3882c5be6423cd030bd7cb69671ef27dfe7a541903edc4e23168009

因为附件里说key是16位,所以试了一下截前16字节作为key来解aes

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from Crypto.Cipher import AES

key = 'dd8e671df3882c5be6423cd030bd7cb69671ef27dfe7a541903edc4e23168009'
iv_hex = '88219bdee9c396eca3c637c0ea436058' #原始iv转hex的值
ciphertext= '''b700ae6d0cc979a4401f3dd440bf9703b292b57b6a16b79ade01af58025707fbc29941105d7f50f2657cf7eac735a800ecccdfd42bf6c6ce3b00c8734bf500c819e99e074f481dbece626ccc2f6e0562a81fe84e5dd9750f5a0bb7c20460577547d3255ba636402d6db8777e0c5a429d07a821bf7f9e0186e591dfcfb3bfedfc'''

# 把hex值转成bytes
iv = bytes.fromhex(iv_hex)
key = bytes.fromhex(key)[:16]
ciphertext = bytes.fromhex(ciphertext)

aes = AES.new(key, AES.MODE_CBC, iv)
plaintext = aes.decrypt(ciphertext)
print('plaintext:', plaintext)
# plaintext: b'6148523063484d364c793970625763784c6d6c745a3352774c6d4e76625338794d44497a4c7a41334c7a49304c336c5061316858553070554c6e42755a773d3d'

得到的明文拿去解base16,然后再解base64得到

https://img1.imgtp.com/2023/07/24/yOkXWSJT.png

把图片下载下来:

yOkXWSJT

又是一个奇怪的语言,想到本题背景是星穹铁道,所以去找了一下星铁的文字,发现图片里的应该是宇宙通用文

去wiki找到了码表:
宇宙通用文

对照得到flag:

NepCTF{HRP_aIways_likes_March_7th}

pwn-HRP-CHAT-3

获取途径是进入Start,然后打败boss。

由于只能攻击一次,所以找一个攻击最高的(H3h3QAQ),保证能秒掉boss。

Shop里没有,只能抽卡(RollCard)

出来后直接去打Start就行,输入的下标在源码里找分别对应Characters和skill这两个数组的下标,所以注意自己的H3h3QAQ是哪个下标就行了

image-20230813203835458

Welcome to my other publishing channels