NISACTF 2022WP

[NISACTF 2022]sign_crypto

题目
提示:flag为大写喔~

思路
签到题是LATEX符号

1
\ni \sum \sum \chi \theta \forall \{ \eta \Diamond \infty \tau \_ \widehat{nisa} \int \triangle \hookleftarrow \_ \Lambda \aleph \tau \ell \xi \}

因为flag格式为NSSCTF{}所以发现是提取首字母
NSSCTF{EDIT_WITH_LATEX}

[NISACTF 2022]funnycaeser

题目
凯撒5号说:大家为什么都说我很奇怪?
附件:txt->NRQ;P<uLliW^(XQ/QT\NDh
思路
shift=5
解密一次得到IML;K<pGgdR^(SL/LO\IYc
尝试再解密一次得到了flag

flag:NSSCTF{Stran9e_Caesar}

题目提示很奇怪->变异凯撒

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
import string
def caesar_cipher(text, shift):
result=""
for char in text:
if char.isalpha():
shift_amount=shift%26
if char.islower():
base=ord('a')
shifted_char=chr((ord(char)-base+shift_amount)%26+base)
else:
base=ord('A')
shifted_char=chr((ord(char)-base+shift_amount)%26+base)
result += shifted_char
else:
result += char
return result
def caesar_decipher(text, shift):
return caesar_cipher(text, -shift)
cipher=r'NRQ;P<uLliW^(XQ/QT\NDh'
cipher5=''
for i in range(len(cipher)):
cipher5+=caesar_decipher(cipher[i],5)
print(cipher5)
#IML;K<pGgdR^(SL/LO\IYc
flag = ''
for i in range(len(cipher5)):
flag += chr(ord(cipher5[i])+i+5)
print(flag)

NSSCTF{Stran9e_Caesar}

[NISACTF 2022]normal

题目:
txt文件里面只包含三个字符!?.
Ook!解码使用在线解码dcode.fr/en?q=ook
Ook! 是一种基于 Brainfuck 的 esoteric 编程语言,常用于 CTF 密码学/杂项题目。它的特点是只用 Ook. Ook? Ook! 三种组合来表示不同指令。
\u0065\u0047\u006c\u0069\u005a\u0057\u0067\u0074\u0061\u0032\u0056\u006a\u0062\u0032\u0063\u0074\u0064\u006e\u006c\u0032\u0059\u0057\u0073\u0074\u0062\u0057\u006c\u0073\u0061\u0057\u0077\u0074\u0062\u0058\u006c\u0074\u005a\u0057\u0059\u0074\u0059\u006e\u0056\u0077\u0059\u0057\u0067\u0074\u0065\u006d\u0056\u0077\u0061\u0057\u0067\u0074\u0061\u0047\u0046\u0069\u0065\u0057\u0073\u0074\u0062\u0047\u0056\u0073\u0064\u0057\u0051\u0074\u0059\u0032\u0039\u0073\u0064\u0057\u0073\u0074\u0062\u0048\u006c\u0030\u0062\u0032\u0077\u0074\u0061\u0033\u0056\u0074\u0061\u0057\u0067\u0074\u0062\u0057\u0039\u0036\u0064\u0058\u0067\u003d
Unicode转ASCII
eGliZWgta2Vjb2ctdnl2YWstbWlsaWwtbXltZWYtYnVwYWgtemVwaWgtaGFieWstbGVsdWQtY29sdWstbHl0b2wta3VtaWgtbW96dXg=
一眼base64
xibeh-kecog-vyvak-milil-mymef-bupah-zepih-habyk-lelud-coluk-lytol-kumih-mozux
查找发现是Bubble Babble 编码
以 x 开头和结尾,中间用 - 分隔多个 5 字符组,每个组由辅音-元音-辅音-元音-辅音交替组成:

字母表

类别 字母 数量
元音 (vowel) a e i o u y 6 个
辅音 (consonant) b c d f g h k l m n p r s t v z 17 个

注意:官方的辅音表 bcdfghklmnprstvz 中没有 j q w x y(w 和 x 被用作特殊标记)

编码原理
每个 5 字符组 (C₁ V₁ C₂ V₂ C₃) 编码 2 个字节:

  • 组成两个音节值:A = C₁ × 6 + V₁,B = C₂ × 6 + V₂
  • 合并成一个 16 位整数:N = A × 6 + B(范围 0~1295)
  • 拆成两个字节:byte1 = N / 256,byte2 = N % 256
  • 校验位:C₃ = (A + B) % 36
    dcode.fr/bubble-babble-cipher
    厨子上面没找到这个编码在线解一下
    AVFN{h_xa0j_jU@g_!guvaX}
    格式应为NISA{}
    猜测有移位随波逐流跑一下,其实可以发现ASCII中A为65,N为78,所以shift=13
    ROT13解码得到flag
    NISA{u_kn0w_wH@t
    !_thinK}
    NSSCTF上格式为NSSCTF{}我说怎么提交不上去

[NISACTF 2022]xor

题目:

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
import os
import base64
from Crypto.Util import number, strxor
#from flag import flag

flag='xxxxxxxxxxxxxxxxxx'


def gen_key():
return [os.urandom(16) for _ in range(8)]

def rnd(b: bytes, k: bytes):
l = b[:16]
r = b[16:]
_r = l
_l = strxor.strxor(strxor.strxor(r, k), l)
return _l + _r

def enc(b: bytes, ks):
c = b
for i in range(8):
c = rnd(c, ks[i])
return c

if __name__ == '__main__':
a = os.urandom(32)
ks = gen_key()
enc_a = enc(a, ks)
enc_flag = enc(flag.encode(), ks)
print(base64.b64encode(a).decode())
print(base64.b64encode(enc_a).decode())
print(base64.b64encode(enc_flag).decode())

#i03yXzXWe4QTiwJHlUZo6iqEdDkwJVviSOQ7CM3vJmM=
#4EnYOhbivTMP5r4VYLA8cwJBFTXIeeKAoNf/3ctgLLA=
#+qyVMEei1eN3YbV/z2kjcaCKngWc2pW2/e7HwpXKaj0=

思路

1
2
def gen_key():
return [os.urandom(16) for _ in range(8)]

生成8个16字节的随机密钥

1
2
3
4
5
6
def rnd(b: bytes, k: bytes):
l = b[:16]
r = b[16:]
_r = l
_l = strxor.strxor(strxor.strxor(r, k), l)
return _l + _r

Feistel 结构
将32字节分为左右各16字节,
将上一轮的left赋值给下一轮的right,
将上一轮的right异或密钥异或上一轮的left赋值给下啊一轮的left
即: L_new = L ⊕ R ⊕ K
R_new = L

1
2
3
4
5
6

def enc(b: bytes, ks):
c = b
for i in range(8):
c = rnd(c, ks[i])
return c

进行八轮异或加密

1
2
3
#i03yXzXWe4QTiwJHlUZo6iqEdDkwJVviSOQ7CM3vJmM=
#4EnYOhbivTMP5r4VYLA8cwJBFTXIeeKAoNf/3ctgLLA=
#+qyVMEei1eN3YbV/z2kjcaCKngWc2pW2/e7HwpXKaj0=

i03yXzXWe4QTiwJHlUZo6iqEdDkwJVviSOQ7CM3vJmM= ← 解码后 32 字节(明文 a)
4EnYOhbivTMP5r4VYLA8cwJBFTXIeeKAoNf/3ctgLLA= ← 解码后 32 字节(enc_a)
+qyVMEei1eN3YbV/z2kjcaCKngWc2pW2/e7HwpXKaj0= ← 解码后 32 字节(enc_flag)


EXP

1
2
3
4
5
6
7
8
9
10
11
12
13
import base64
from Crypto.Util.strxor import strxor as xor
b="i03yXzXWe4QTiwJHlUZo6iqEdDkwJVviSOQ7CM3vJmM="
c="4EnYOhbivTMP5r4VYLA8cwJBFTXIeeKAoNf/3ctgLLA="
d="+qyVMEei1eN3YbV/z2kjcaCKngWc2pW2/e7HwpXKaj0="
a=base64.b64decode(b)
enc_a=base64.b64decode(c)
enc_flag=base64.b64decode(d)
cipher1=xor(enc_a[:16],enc_flag[:16])
flag2=xor(a[16:],cipher1)
cipher2=xor(enc_a[16:],enc_flag[16:])
flag1 = xor(xor(xor(cipher2,flag2),a[:16]),a[16:])
print(b"NSSCTF{" + flag1 + flag2 + b"}")

NSSCTF{3c4e05db6512d51e0a93ae320c0bb69a}