MISC-Real Checkin
零宽字符隐写
MISC方向的签到题,不过很有意思。
去比赛的QQ群@之后得到这样一串消息 `@tl2cents 叮咚!你的好大儿zbr向你发送了签到码,请注意查收:Q9LimBaEBG9170WBI41KAfuRu6f9leWI7omgqq9yhBiUcpwPFGfREdjOsXWCNmRlPljq/33rj8ri2HDafqHrw5uzc3h4pYvfPjBAE2UJxU97CSuG9UlBZRiSQEpZzRnL`. 貌似挺简单的,之前没有hint,直接复制后面base64的编码然后解码,发现是乱码。所以肯定有加密,不会这么白给的。那么我们仔细看一上面的消息,如下(发现是零宽字符隐写): 仔细看下有哪些零宽字符,UE、Winhex什么的都行,或者直接去CyberChef看。有下面五个零宽字符:
1
hideset=[b'\xe2\x80\x8b',b"\xe2\x80\x8c",b"\xe2\x80\x8d",b"\xe2\x80\x8e",b"\xe2\x80\x8f"]
直接去在线网站extract隐写的东西,发现都行不太通,那就看看隐写的这些字符特征,将
U+200B,U+200C,U+200D,U+200E,U+200F
,分别看成0,1,2,3,4,extract出来是这样子的:1
2
3
4
5
6
7
8
9
10data=open('realcheckin/msg','rb').read()
hideset=[b'\xe2\x80\x8b',b"\xe2\x80\x8c",b"\xe2\x80\x8d",b"\xe2\x80\x8e",b"\xe2\x80\x8f"]
num=''
for i in range(len(data)//3):
if data[3*i:3*i+3] in hideset:
print(hideset.index(data[3*i:3*i+3]),end='')
num=num+str(hideset.index(data[3*i:3*i+3]))
print(len(num))
#0000234000023200002310000112000023000002340000313000011200003110000311000024300002330000112000014300003120000310000023000002330000233000024300003030000241
#154
五进制解码
可以看到上面的字符串基本都是4个0然后后面3位在变化,显然7个一组,类似ASCII,当成5进制稍微算一下第一个数就是69,刚好就是E的ASCII码,Okay,基本确定五进制,然后写个脚本extract一下:
1
2
3
4
5
6
7
8
9
10strs="0000234000023200002310000112000023000002340000313000011200003110000311000024300002330000112000014300003120000310000023000002330000233000024300003030000241"
for i in range(len(strs)//7):
num=strs[7*i:7*i+7]
n=0
for j in range(7):
# print(num[-j])
n=n+int(num[-(j+1)])*(5**j)
print(chr(n),end="")
#output: ECB AES QQID 0RPADDING
好的,AES,加密,然后密钥KEY显然就是和你的QQ号有关,后面的0RPADDING
就是拿0R
什么的填充到密钥长度,不知道啥意思, 反正都试一下,最后发现是直接拿QQ号当成16进制的秘钥,后面填充全0(只能看第二个hint一个个试试运气吧)。解密结果如下:好家伙,这套娃,然后去天璇的公众号输入上面的字符串拿到flag
1
MRCTF{Let's_Have_Fun!} #有一说一这个flag也太好猜了
RE-Real Checkin
这个就是真正的签到题了,发现加了upx 3.91
壳,直接下个upx
脱壳,然后放进IDA看程序逻辑:
简单逻辑,甚至base64编码都写出来了,但是wait
,把中那段比较的base64编码字符放进一般的base64解码,发现出来是乱码?然后仔细看下base64的encode函数,发现它的字符转换表如下:
转换成字符发现它把一般的大小写字符串换了个位置。所以大小写字母转换一下,TVJDVEZ7d0VsYzBNZV90MF9NUkNURl8ybzIxISEhfQ==
放进base64解码得到flag:
1 | MRCTF{wElc0Me_t0_MRCTF_2o21!!!} |