站点图标 Wankko Ree's Blog

河南金盾信安杯S2 2020 WriteUp

难度中等,比较看功底
队伍成绩:2499pt/12kill/18名/240有解/272报名
个人成绩:1256pt/7kill/45名/768有解/934报名
最终公布成绩:14名/二等奖

Misc

注意数字

WriteUp

解压得到图片一张,发现图片文件尾后还存在压缩包,解压得到长文本b'...............',解码base6431次后得到yqjb{lha-drwohjw-ekf},猜测为凯撒密码,测试发现所有偏移均不对。

根据加密方向yqjb->flag,得到偏移-19 -5 -9 +5,猜测可能是奇偶变化偏移,每次变化+10,但是最终得到的flag并不正确。

于是猜测可能是仿射密码,对仿射参数ab进行协同调整后,发现在a=9 b=23时出现有实义明文,得到flag。

flag

flag{six-yuntian-hjq}

我和十六有个约定

WriteUp

解压附件得到图片一张、有密码压缩包一份,图片文件尾存在字符串隐写keyis7034735377307244,猜测是八进制,但是不对,尝试十六进制转文本,得到密码p4sSw0rD,解压两个文本,其中一个是data:image/png;base64链接,浏览器打开得到图片如下。

另一个文本为十六进制,导入后得到如下文件。

发现JPG的特征字符串JFIF的逆置状态,根据其原始位置可知应当为按行逆置,写脚本可得到jpg图片一张。

enc = open("flag.data","rb")
dec = open("flag.jpg","wb")
line = b"\xff"
while line:
    line = enc.read(16)
    print(line)
    line = line[::-1]
    dec.write(line)
enc.close()
dec.close()

拼接二维码得到完整二维码。

二维码解码得到flag。

flag

flag{you_get_1t}

Crypto

base

WriteUp

解压附件得到data:image/png;base64链接,直接浏览器打开得到如下二维码。

二维码解码得到字符串F#S<YReBy{f.WwU{CSv^e^'n*D

base92解码得到flag。

flag

flag{you_very_good!!}

不一样的凯撒

WriteUp

解压附件得到文本bhag{asb_zsz_vtsz_aszw},根据题目的描述猜测是变异凯撒。

已知部分加密方向为bhag->flag,猜测可能是+4 +4 +0 +0 +4 +4...的模式,但是无论遇到非字母是否跳过,都无法得到正确的flag。

于是继续观察,发现bh在字母表序列位于偶数位,ag位于奇数位,然后对着ascii码表发现_{}也在奇数位,所以猜测应当位奇数位不变,偶数位+4的模式,写脚本得到正确flag。

exp

flag = "bhag{asb_zsz_vtsz_aszw}"
flagT = ""
for i in flag:
    if ord(i) % 2:
        flagT += i
    else:
        n = (ord(i) - ord('a') + 4) % 26 + ord('a')
        flagT += chr(n)
print(flagT)

flag

flag{asf_dsd_zxsd_asdw}

今天是个好日子

WriteUp

解压得到二维码,二维码解码得到字符串\u0056\u0054\u004a\u0047\u0063\u0032\u0052\u0048\u0056\u006d\u0074\u0059\u004d\u0053\u0074\u006c\u0061\u0046\u0068\u006b\u0052\u0048\u0056\u0042\u004d\u0030\u0056\u0044\u004e\u0031\u0052\u006a\u0063\u006a\u0056\u0069\u0054\u0030\u0068\u004f\u0061\u0048\u0070\u0069\u0052\u0056\u0042\u0050\u0065\u006a\u0055\u0031\u0052\u0032\u0052\u0035\u004e\u0056\u004e\u0030\u0057\u006c\u0055\u0033\u0055\u006b\u0052\u0036\u0057\u0054\u0064\u0049\u005a\u006e\u0049\u0031\u0054\u0054\u0046\u004b\u0062\u0030\u0035\u0030\u0065\u0067\u006f\u0067

Unicode解码得到字符串VTJGc2RHVmtYMStlaFhkRHVBM0VDN1RjcjViT0hOaHpiRVBPejU1R2R5NVN0WlU3UkR6WTdIZnI1TTFKb050egog

Base64解码得到U2FsdGVkX1+ehXdDuA3EC7Tcr5bOHNhzbEPOz55Gdy5StZU7RDzY7Hfr5M1JoNtz

根据开头U2Fsd判断是AES/DES/RC4/Rabbit/TripleDes的其中一种,无密码状态下测试解密无法得到明文,于是根据题目猜测密码为今天日期20122020201220的其中一个,在使用20201220作为密码进行AES解密时,得到flag。

flag

flag{2020jdbctfdasai}

Reverse

login

WriteUp

ida打开附件,通过动态调试可知核心函数为sub_401060()

简单分析可知输入的flag经过蓝框的三步处理后和原内容相同,即xor(add(shuffle(flag, xmmword_41F8C0), xmmword_41F8D0)xmmword_41F8E0) == flag

其中shuffle可理解为按xmmword_41F8C0的顺序打散flagadd为4字节加法。

于是得到如下方程。

(flag[2] + 0xef) ^ 0x36 = flag[0]
(flag[6] + 0xbe) ^ 0x67 = flag[1]
(flag[7] + 0xad) ^ 0xbf = flag[2]
(flag[1] + 0xde) ^ 0x2d = flag[3]

(flag[5] + 0xad) ^ 0x8d = flag[4]
(flag[b] + 0xde) ^ 0x47 = flag[5]
(flag[9] + 0xe1) ^ 0x0b = flag[6]
(flag[e] + 0xfe) ^ 0x4c = flag[7]

(flag[3] + 0x37) ^ 0xe8 = flag[8]
(flag[f] + 0x13) ^ 0x76 = flag[9]
(flag[4] + 0x37) ^ 0xeb = flag[a]
(flag[8] + 0x13) ^ 0xb9 = flag[b]

(flag[a] + 0x66) ^ 0xca = flag[c]
(flag[c] + 0x74) ^ 0xc8 = flag[d]
(flag[d] + 0x63) ^ 0xf9 = flag[e]
(flag[0] + 0x67) ^ 0xcd = flag[f]

已知如下变量。

flag[0] = f = 0x66
flag[1] = l = 0x6c
flag[2] = a = 0x61
flag[3] = g = 0x67
flag[4] = { = 0x7b
flag[e] = } = 0x7d
flag[f] = \0 = 0x00

代入得到如下方程。

(0x61 + 0xef) ^ 0x36 = 0x66
(flag[6] + 0xbe) ^ 0x67 = 0x6c
(flag[7] + 0xad) ^ 0xbf = 0x61
(0x6c + 0xde) ^ 0x2d = 0x67

(flag[5] + 0xad) ^ 0x8d = 0x7b
(flag[b] + 0xde) ^ 0x47 = flag[5]
(flag[9] + 0xe1) ^ 0x0b = flag[6]
(0x7d + 0xfe) ^ 0x4c = flag[7]

(0x67 + 0x37) ^ 0xe8 = flag[8]
(0x00 + 0x13) ^ 0x76 = flag[9]
(0x7b + 0x37) ^ 0xeb = flag[a]
(flag[8] + 0x13) ^ 0xb9 = flag[b]

(flag[a] + 0x66) ^ 0xca = flag[c]
(flag[c] + 0x74) ^ 0xc8 = flag[d]
(flag[d] + 0x63) ^ 0xf9 = 0x7d
(0x66 + 0x67) ^ 0xcd = 0x00

其中第一行式子发现0x61 + 0xef > 0xff,所以第二行式子应修正为(flag[6] + 1 + 0xbe) ^ 0x67 = 0x6c,解得flag[6] = L = 0x4c。由于0x4c + 0xbe > 0xff,所以第三行式子应修正为(flag[7] + 1 + 0xad) ^ 0xbf = 0x61,解得flag[7] = 0 = 0x30

第五行解得flag[5] = I = 0x49,代入第六行解得flag[b] = 0 = 0x30。由于0x30 + 0xde > 0xff,所以修正第七行为(flag[9] + 1 + 0xe1) ^ 0x0b = flag[6]

按照上述方法依次解方程,最终得到如下16行表达式。

(a 0x61 + 0xef) ^ 0x36 = flag[0] = f = 0x66
(L 0x4c + 1 + 0xbe) ^ 0x67 = flag[1] = l = 0x6c
(0 0x30 + 1 + 0xad) ^ 0xbf = flag[2] = a = 0x61
(l 0x6c + 0xde) ^ 0x2d = flag[3] = g = 0x67

(I 0x49 + 0xad) ^ 0x8d = flag[4] = { = 0x7b
(0 0x30 + 0xde) ^ 0x47 = flag[5] = I = 0x49
(e 0x65 + 1 + 0xe1) ^ 0x0b = flag[6] = L = 0x4c
(} 0x7d + 1 + 0xfe) ^ 0x4c = flag[7] = 0 = 0x30

(g 0x67 + 0x37) ^ 0xe8 = flag[8] = v = 0x76
(\0 0x00 + 0x13) ^ 0x76 = flag[9] = e = 0x65
({ 0x7b + 0x37) ^ 0xeb = flag[a] = Y = 0x59
(v 0x76 + 0x13) ^ 0xb9 = flag[b] = 0 = 0x30

(Y 0x59 + 0x66) ^ 0xca = flag[c] = u = 0x75
(u 0x75 + 0x74) ^ 0xc8 = flag[d] = ! = 0x21
(! 0x21 + 0x63) ^ 0xf9 = flag[e] = } = 0x7d
(f 0x66 + 0x67) ^ 0xcd = flag[f] = \0 = 0x00

得到flag。

flag

flag{IL0veY0u!}

easycrc

WriteUp

直接dbg动态调试。

在这发现正在处理文本,测试几次不一样的输入发现处理的东西都一样,所以应当是在解密某些数据,直接跟到这块写入的内存去,然后在出口下断点,运行一下,发现内存中的字符串ZmxhZ3tIYWNrX2NyY19pc19mdW59有点像base64,尝试解码直接得到flag。

flag

flag{Hack_crc_is_fun}


The End
退出移动版