HGAME2022 WEEK 1-1

熟悉的HGAME,花了几天把web.misc.crypto,还有几道签到题做了,这里做个记录

MISC

欢迎欢迎!热烈欢迎!

签到题,公众号发个消息就有

图片

这个压缩包有点麻烦

图片

拿到后是一个压缩包图片

告诉我们纯数字的6位密码是不安全的这里尝试直接暴力破解得到密码

图片

获得密码后打开readme获得如下提示

图片

再查看另外一个可知是一个密码本即字典,采用字典破解图片

获得如下密码&-`;qpCKliw2yTR\

打开后又有一个readme,打开

图片

而且发现这两者的crc是相同的,

图片

可以尝试采取明文攻击,注意这里提示了要以store模式进行

图片

这里压缩等级选择仅存储,然后进行明文攻击,慢慢等待就可以。然后获得一张图片

图片

拉进010发现里面有压缩包,binwalk分离出来,结果还是有密码的,把压缩包拉进010,发现存在伪加密,改一下就结束了,然后获得flag

图片

好康的流量

下载获得一个流量,拉进wireshark,发现存在base64

图片

加上题目名字是涩图,且下面的url解码出来是涩图.png,采取base64转图片

获得一张图片,用stegslove打开,发现一半flag

图片

接着查看lsb,这次是竖着的所以有点小坑,发现另一半

图片

组合在一起就行

群青(其实是幽灵东京)

打开网址是一首歌,另存到桌面上,用au打开,发现是这首歌的作者Yoasobi

再把这首歌拉进010看,发现有个silenteye提示,用silenteye解密,并用刚才获得的组合名密码解密

图片

获得另外一个音频,不过这个很刺耳,有点类似无线电,网络查询资料知道有道sctf2020的无线电考点基本一样,用安卓软件robot36直接一把梭了

图片

扫出来就是flag

CRYPTO

Easy RSA

图片

打开附件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from math import gcd
from random import randint
from gmpy2 import next_prime
from Crypto.Util.number import getPrime
from secret import flag

def encrypt(c):
    p = getPrime(8)
    q = getPrime(8)
    e = randint(0, p * q)
    while gcd(e, (p - 1) * (q - 1)) != 1:
        e = int(next_prime(e))
    return e, p, q, pow(ord(c), e, p * q)

if __name__ == '__main__':
    print(list(map(encrypt, flag)))
    # [(12433, 149, 197, 104), (8147, 131, 167, 6633), (10687, 211, 197, 35594), (19681, 131, 211, 15710), (33577, 251, 211, 38798), (30241, 157, 251, 35973), (293, 211, 157, 31548), (26459, 179, 149, 4778), (27479, 149, 223, 32728), (9029, 223, 137, 20696), (4649, 149, 151, 13418), (11783, 223, 251, 14239), (13537, 179, 137, 11702), (3835, 167, 139, 20051), (30983, 149, 227, 23928), (17581, 157, 131, 5855), (35381, 223, 179, 37774), (2357, 151, 223, 1849), (22649, 211, 229, 7348), (1151, 179, 223, 17982), (8431, 251, 163, 30226), (38501, 193, 211, 30559), (14549, 211, 151, 21143), (24781, 239, 241, 45604), (8051, 179, 131, 7994), (863, 181, 131, 11493), (1117, 239, 157, 12579), (7561, 149, 199, 8960), (19813, 239, 229, 53463), (4943, 131, 157, 14606), (29077, 191, 181, 33446), (18583, 211, 163, 31800), (30643, 173, 191, 27293), (11617, 223, 251, 13448), (19051, 191, 151, 21676), (18367, 179, 157, 14139), (18861, 149, 191, 5139), (9581, 211, 193, 25595)]

这个RSA也确实简单,大致来看这道题可以不看成rsa就看成是到别的题实际上就是求每组的chr(C),c是个ASCII    从可以显示的ASCII(32,127)中一个一个匹配过去,暴力   只要匹配上就输出
图片

写个jio本就可以了

import gmpy2

secret = [(12433, 149, 197, 104), (8147, 131, 167, 6633), (10687, 211, 197, 35594), (19681, 131, 211, 15710), (33577, 251, 211, 38798), (30241, 157, 251, 35973), (293, 211, 157, 31548), (26459, 179, 149, 4778), (27479, 149, 223, 32728), (9029, 223, 137, 20696), (4649, 149, 151, 13418), (11783, 223, 251, 14239), (13537, 179, 137, 11702), (3835, 167, 139, 20051), (30983, 149, 227, 23928), (17581, 157, 131, 5855), (35381, 223, 179, 37774), (2357, 151, 223, 1849), (22649, 211, 229, 7348), (1151, 179, 223, 17982), (8431, 251, 163, 30226), (38501, 193, 211, 30559), (14549, 211, 151, 21143), (24781, 239, 241, 45604), (8051, 179, 131, 7994), (863, 181, 131, 11493), (1117, 239, 157, 12579), (7561, 149, 199, 8960), (19813, 239, 229, 53463), (4943, 131, 157, 14606), (29077, 191, 181, 33446), (18583, 211, 163, 31800), (30643, 173, 191, 27293), (11617, 223, 251, 13448), (19051, 191, 151, 21676), (18367, 179, 157, 14139), (18861, 149, 191, 5139), (9581, 211, 193, 25595)]

1
2
3
4
5
6
7
8
9
10
11
12
13
flag = ""
for m in range(38):
#if 8 == 8 :
    e = secret[m][0]
    p = secret[m][1]
    q = secret[m][2]
    i = secret[m][3]
    lam = p*q
    for c in range(32,127):
            if i == gmpy2.powmod(c, e, lam):
                flag += chr(c)
print(flag)
print(len(flag))

Matryoshka

图片

1
⠨⠨⠤⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠤⠤⠤⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠤⠨⠨⠌⠨⠨⠨⠤⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠤⠨⠨⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠤⠤⠤⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠤⠤⠤⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠤⠨⠤⠌⠤⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠨⠤⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠤⠨⠨⠌⠨⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠤⠨⠨⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠨⠤⠌⠤⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠤⠨⠨⠌⠨⠨⠨⠤⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠤⠤⠤⠤⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠨⠨⠨⠌⠨⠨⠨⠤⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠨⠤⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠤⠨⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠤⠤⠨⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠨⠨⠨⠌⠨⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠤⠌⠤⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠤⠨⠨⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠤⠤⠤⠤⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠌⠤⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠤⠤⠨⠌⠨⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠤⠨⠨⠌⠨⠨⠨⠤⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠤⠤⠤⠤⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠤⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠨⠤⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠤⠤⠤⠤⠌⠨⠨⠨⠤⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠤⠨⠤⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠨⠨⠨⠌⠨⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠤⠨⠨⠨⠨⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠨⠨⠨⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠤⠤⠤⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠌⠤⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠤⠤⠤⠤⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠤⠨⠨⠨⠨⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠤⠤⠤⠌⠨⠨⠨⠤⠤⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠤⠨⠨⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠤⠤⠤⠌⠨⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠤⠨⠤⠌⠤⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠤⠨⠨⠨⠨⠌⠨⠨⠨⠤⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠤⠤⠤⠤⠌⠨⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠤⠤⠤⠤⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠨⠨⠨⠌⠨⠨⠨⠤⠤⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠤⠨⠨⠨⠨⠌⠤⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠨⠨⠨⠌⠨⠨⠨⠤⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠤⠨⠤⠌⠤⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠤⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠨⠨⠤⠌⠤⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠨⠨⠨⠌⠤⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠨⠨⠤⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠨⠨⠨⠌⠨⠨⠨⠤⠤⠌⠤⠤⠨⠨⠤⠤⠌⠤⠤⠤⠨⠨⠌⠤⠨⠨⠨⠨⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠨⠨⠤⠌⠨⠨⠨⠨⠤⠌⠤⠤⠨⠨⠤⠤⠌⠨⠨⠨⠨⠤⠌⠤⠨⠨⠨⠨

打开给了一串很像盲文的东西,直接拿去解码没用,仔细观察只有三种图案组成,考虑为摩斯,解码有点迹象,但依旧不像有用的信息,查看提示,纸条背面,考虑是先逆序再摩斯
得到一串ascii(十六进制)

1
46,66,42,75,66,45,46,6e,6d,4c,73,36,44,33,73,69,59,74,4c,36,58,32,70,34,69,4e,30,63,64,53,6c,79,6b,6d,39,72,51,4e,39,6f,4d,53,31,6a,6b,73,39,72,4b,32,52,36,6b,4c,38,68,6f,72,30,3d

接下来就直接用工具一把梭了
图片

English Novel

下载后得明文和密文以及加密脚本

1
2
3
4
5
6
7
8
9
10
11
def encrypt(data, key):
    assert len(data) <= len(key)
    result = ""
    for i in range(len(data)):
        if data[i].isupper():
            result += chr((ord(data[i]) - ord('A') + key[i]) % 26 + ord('A'))
        elif data[i].islower():
            result += chr((ord(data[i]) - ord('a') + key[i]) % 26 + ord('a'))
        else:
            result += data[i]
    return result

很明显的维吉尼亚加密,去看明文和密文已经打乱顺序,并未按照他给的顺序排列,虽然通过大小排序或者其他方法也能匹配到,理论上是可以找一对不是特别短的明文的和密文手算获得密钥然后去用在线解密就行。但是这里我还是请教了其他师傅,采取了脚本

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
keylis = [-1] * 44
flag_cip = "klsyf{W0_j0v_ca0z_'Ks0ao-bln1qstxp_juqfqy'?}"
cip_list = [open('./encrypt/part'+str(i)+'.txt', 'r').read(44) for i in range(409)]
msg_list = [open('./original/part'+str(i)+'.txt', 'r').read(44) for i in range(409)]

while -1 in keylis:
    for cip in cip_list:
        for msg in msg_list:
            flag = True
            for i in range(44):
                if (cip[i].islower() ^ msg[i].islower()) or \
                    (cip[i].isupper() ^ msg[i].isupper()) or \
                        ((cip[i].isupper() or cip[i].islower()) ^ (msg[i].isupper() or msg[i].islower())):
                    flag = False
                    break
            if flag:
                for i in range(44):
                    if cip[i].isupper() or cip[i].islower():
                        keylis[i] = (ord(cip[i]) - ord(msg[i])) % 26

print(keylis)
result = ""
for i in range(44):
    if flag_cip[i].isupper():
        result += chr((ord(flag_cip[i]) - ord('A') - keylis[i]) % 26 + ord('A'))
    elif flag_cip[i].islower():
        result += chr((ord(flag_cip[i]) - ord('a') - keylis[i]) % 26 + ord('a'))
    else:
        result += flag_cip[i]
print(result)

Dancing Line

给了一张图片

图片

转向处当1不转当0,左上走到右下,碰见黑的就截断,ascii就是flag

类似摩斯,只不过是图片形式。可以自己记录下转向与否再解密,或者直接写个脚本,这里用的其他师傅的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from PIL import Image
import numpy as np
ppp = Image.open('Dancing Line.bmp')
mmm = np.asarray(ppp)
m = mmm.shape[0]
n = mmm.shape[1]
pos = []
for i in range(m):
    for j in range(n):
        if mmm[i][j][0] != 255:
            pos.append((i, j))
typ = 1
liss = []
tmp = 0
for i in range(1, len(pos)):
    tmp_typ = (pos[i - 1][0] == pos[i][0])
    tmp = 2 * tmp + (typ ^ tmp_typ)
    if i % 8 == 0:
        liss.append(tmp)
        tmp = 0
for x in liss:
    print(chr(x), end = '')

IOT

饭卡的uno

图片

直接把附件扔进ida,加个H就是flag