难度中等,比较看功底
队伍成绩:2499
pt/12
kill/18
名/240
有解/272
报名
个人成绩:1256
pt/7
kill/45
名/768
有解/934
报名
最终公布成绩:14
名/二等奖
Misc
注意数字
WriteUp
解压得到图片一张,发现图片文件尾后还存在压缩包,解压得到长文本b'...............'
,解码base64
31次后得到yqjb{lha-drwohjw-ekf}
,猜测为凯撒密码,测试发现所有偏移均不对。
根据加密方向yqjb
->flag
,得到偏移-19 -5 -9 +5
,猜测可能是奇偶变化偏移,每次变化+10
,但是最终得到的flag并不正确。
于是猜测可能是仿射密码,对仿射参数a
和b
进行协同调整后,发现在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
的其中一种,无密码状态下测试解密无法得到明文,于是根据题目猜测密码为今天日期20
、1220
、20201220
的其中一个,在使用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
的顺序打散flag
,add
为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}
Comments NOTHING