2019GDQWB

连续五天打了护网杯、N1CTF、ByteCTF、广东省强网杯,也自闭了五天,书也不看了,课也不上了,逆向逆得一脸懵逼,尤其是广东省强网杯两道逆向实在打不动,这是一个菜鸡逆向手被逼做web的血泪故事(菜是原罪

Crypto相对来说比较容易,第一道hash(argon2)实在太强了服务器都跑不动,第三道RSA挺有意思的,打算有空单独写一下(咕咕咕),Web是第一次做,从入门到放弃,签了个到就放弃了,MISC纯属脑洞,RE自闭

Crypto

老王的秘密

shamir,没啥好说的直接解

1
2
3
4
5
6
7
8
9
10
11
shares = [
'1-fddc7d57594928fb74a507ab9cba0b28b92bb6e7b36a9925a105eeddac020e64',
'3-84f82314003c9690eeacd823b22680ccbe93ac098cabdd0a992c095dde0031cf',
'5-b0e2e8d2cadc91f8f2f357a42e26aeabaccbfa7731437298ca23d8a4a5424ce4',
'7-810e7545213971a3c7c2dce3d0998764d0bc1e3b866b15ad0deebaa7abcf64c5',
'9-b4da0bd03394e4bdfef92f16365e8811d9614f11b99111bcf8a4e68ba79626a2',
'b-661069e7d491719759a3199be1f65ffb6db92d1b014abb4e33ca7e32f85ee276',
'd-1f84ab9b467a4ec4de4451ed187987785b567bbdde0126d0722e3335a5307d68',
'f-9001dc36dd28c5c5dd7333968e7263986f55dd79cd9be286d21f45e46f53c399']
from secretsharing import PlaintextToHexSecretSharer
print(PlaintextToHexSecretSharer.recover_secret(shares))

f1ag{25019971af01d63d4ea8ad95da516}

美好的回忆

64bits块_CBC加密

加密逻辑为

C = XOR(M,key,iv)

iv = C

给出了前两组的明文、密文

前两组加密逻辑为

C1 = xor(M1,key,iv)

C2 = xor(M2,key,C1)

c1,c2,m1,m2已知,先异或出iv再异或出key再解密即可

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
f = open('flag.txt.encrypted','rb')
s = f.read()
print(s.encode('hex'))
f.close()
c1 = s[:8]
c2 = s[8:16]
p = 'have a good time'
p1 = p[:8]
p2 = p[8:16]
iv = ''
key = ''
for i in range(8):
iv += chr(ord(list(p1)[i]) ^ ord(list(p2)[i]) ^ ord(list(c2)[i]))
print(hex(ord(list(p1)[i]) ^ ord(list(p2)[i]) ^ ord(list(c2)[i])))
for i in range(8):
key += chr(ord(list(p1)[i]) ^ ord(list(c1)[i]) ^ ord(list(iv)[i]))
print(len(iv))
print(len(key))
print(key)
print(key.encode('hex'))
print(iv.encode('hex'))
plain = ''
for i in range(len(s)/8):
for j in range(8):
plain += chr(ord(list(s)[i*8+j]) ^ ord(list(key)[j]) ^ ord(list(iv)[j]))
iv = s[i*8:(i+1)*8]
print(plain)

flag{21cb8c804abb60be5c9befcc928ccf5b}

悲伤的结局

跟上一题一样的加密逻辑,不同的是给出了明文的尾部

由于

Cn = XOR(Mn,key,Cn-1)

Cn-1 = XOR(Mn-1,key,Cn-2)

Mn-1 = XOR(Cn ,Cn-2,Mn)

C已知直接从后往前逆推出明文

还有一个小问题是尾部的padding,遍历一下可以异或出padding为’\x0a\x04\x04\x04\x04’,所以真正明文的尾部为’kee p away from xiaocui!\x0a\x04\x04\x04\x04’,如此就可解密

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
p = 'kee p away from xiaocui!\x0a\x04\x04\x04\x04'
for i in range(len(p)-8):
print (hex(ord(list(p)[i])^ord(list(p)[i+8])))
print(p.encode("hex"))
print('-----')
f = open('flag.txt.encrypted2','rb')
s = f.read()
print(s.encode('hex'))
f.close()
c = []
for i in range(len(s)/8):
c.append(list(s[i*8:i*8+8]))

p24 = list(p[-8:])
p23 = list(p[-16:-8])
p = p24
plain = ''
# plain = 'rom xiaoc'
for i in range(2,25)[::-1]:
m = ''
for j in range(8):
m += chr(ord(p[j])^ord(c[i][j])^ord(c[i-2][j]))
p = list(m)
plain = m + plain
print(plain)

flag{0e82f1e5b75688b4e6d39c08f1651c93}

Web

小明又被拒绝了

修改cookie admin = 1

伪造ip = 127.0.0.1

get flag

免费的,ping一下

过滤了空格,cat,flag等字符,用\和${IFS}绕过即可

payload:111;gre\p${IFS}fla\g${IFS}/fla\g

MISC

完美的错误

题目提示了错位数组,看起来是base58,遍历一下即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import string
import base58
base58_table = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'


def b58decode(cipher_text, table=base58_table):
cipher_text = cipher_text.translate(string.maketrans(table, base58_table))
return base58.b58decode(cipher_text)


c = 'RJv9mjS1bM9MZafGV77uTyDaapNLSk6t358j2Mdf1pbCByjEiVpX'
print(c)
table = base58_table
for i in range(64):
table = table[1:]+table[0]
print(b58decode(c, table))

flag{adb88f7b70a20983833a7615fb103e01}

撸啊撸

图片隐含了一个ELF,ida打开

提取字符串,遍历异或一下

1
2
3
4
5
6
7
s = '938gce1`872db99db`b342d23c0g9g2d'
flag = ''
for i in range(0xff):
for j in s:
flag += chr(i^ord(j))
print(flag)
flag = ''

发现异或到1的时候flag比较正常,包裹上flag{}提交

flag{829fbd0a963ec88ecac253e32b1f8f3e}

0%