比赛详情: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 ; }
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() 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) padding = data[index] index += 1 dat = data[index:] compressed_data = '' for byte in dat: byte = bin (byte)[2 :].rjust(8 , '0' ) compressed_data += byte 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)
虽然还是有点问题,不过已经不妨碍得到结果了()
NepCTF{huffman_zip_666}
misc-ConnectedFive 万宁五子棋,不好评价(
直接玩过去就好了()
(不想再玩一次了,就不放截图了吧,42次也太多了)
misc-CheckIn 签到,题目给了flag
misc-陌生的语言 得到一个图片:
提示了题目中A同学是Atsuko Kagari,查了一下是《小魔女学园》的,显然图中的两种语言应该出自该作品。最后查找确定了上下分别是古代龙语和露娜文
在网上找到了对应的码表
分别得到了nepnep a believing,和heart is your magic
提示flag格式凭语法断句,然后大小写都试一下,得到flag是:
NepCTF{NEPNEP_A_BELIEVING_HEART_IS_YOUR_MAGIC}
misc-小叮弹钢琴 得到一个piano.mid文件,听了一会,发现可能有摩斯密码
用Audacity打开:
发现一半是摩斯,另一半可以侧过来看是一个很大的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
没什么头绪,所以回去重新看题,发现了一些端倪:
这群名看起来怪怪的,…,好咸诶 => 推测出群名是盐,也就是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 AESkey = 'dd8e671df3882c5be6423cd030bd7cb69671ef27dfe7a541903edc4e23168009' iv_hex = '88219bdee9c396eca3c637c0ea436058' ciphertext= '''b700ae6d0cc979a4401f3dd440bf9703b292b57b6a16b79ade01af58025707fbc29941105d7f50f2657cf7eac735a800ecccdfd42bf6c6ce3b00c8734bf500c819e99e074f481dbece626ccc2f6e0562a81fe84e5dd9750f5a0bb7c20460577547d3255ba636402d6db8777e0c5a429d07a821bf7f9e0186e591dfcfb3bfedfc''' 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)
得到的明文拿去解base16,然后再解base64得到
https://img1.imgtp.com/2023/07/24/yOkXWSJT.png
把图片下载下来:
又是一个奇怪的语言,想到本题背景是星穹铁道,所以去找了一下星铁的文字,发现图片里的应该是宇宙通用文
去wiki找到了码表:
对照得到flag:
NepCTF{HRP_aIways_likes_March_7th}
pwn-HRP-CHAT-3 获取途径是进入Start,然后打败boss。
由于只能攻击一次,所以找一个攻击最高的(H3h3QAQ),保证能秒掉boss。
Shop里没有,只能抽卡(RollCard)
出来后直接去打Start就行,输入的下标在源码里找分别对应Characters和skill这两个数组的下标,所以注意自己的H3h3QAQ是哪个下标就行了