Start
IDA,Shift+F12
跟进去,交叉引用
F5来到该函数
关键处
sub_424BA0
可以看出应该是strlen
,先判断v53
的长度是不是36
位,之后作为for
循环推出的条件。
每一次都会对v53
的单个字符与i
进行异或之后判断是否等于下面这一串中的值
写出脚本:
得到第一条信息,the first four chars are 'flag'
continue:
对v56
调用了10次sub_400E44
进行处理,最后与off_6CC090
进行sub_400360,根据经验,sub_400360
应该就是strcmp
off_6CC090:
来到sub_400E44
这里if
就是判断v1
是否等于39
, 条件成立,v2 = 13
之后进入while
循环,每次循环都对a1
中的三个值进行运算,之后存到v9
中
到这里,大概可以看出是一种加密算法。根据最终的结果,猜测应该就是base64加密,并且加密了10次,
将数据整理之后变成了
Vm0wd2VHUXhTWGhpUm1SWVYwZDRWVll3Wkc5WFJsbDNXa1pPVlUxV2NIcFhhMk0xVmpKS1NHVkdXbFpOYmtKVVZtcEtTMUl5VGtsaVJtUk9ZV3hhZVZadGVHdFRNVTVYVW01T2FGSnRVbGhhVjNoaFZWWmtWMXBFVWxSTmJFcElWbTAxVDJGV1NuTlhia0pXWWxob1dGUnJXbXRXTVZaeVdrWm9hVlpyV1hwV1IzaGhXVmRHVjFOdVVsWmlhMHBZV1ZSR1lWZEdVbFZTYlhSWFRWWndNRlZ0TVc5VWJGcFZWbXR3VjJKSFVYZFdha1pXWlZaT2NtRkhhRk5pVjJoWVYxZDBhMVV3TlhOalJscFlZbGhTY1ZsclduZGxiR1J5VmxSR1ZXSlZjRWhaTUZKaFZqSktWVkZZYUZkV1JWcFlWV3BHYTFkWFRrZFRiV3hvVFVoQ1dsWXhaRFJpTWtsM1RVaG9hbEpYYUhOVmJUVkRZekZhY1ZKcmRGTk5Wa3A2VjJ0U1ExWlhTbFpqUldoYVRVWndkbFpxUmtwbGJVWklZVVprYUdFeGNHOVhXSEJIWkRGS2RGSnJhR2hTYXpWdlZGVm9RMlJzV25STldHUlZUVlpXTlZadE5VOVdiVXBJVld4c1dtSllUWGhXTUZwell6RmFkRkpzVWxOaVNFSktWa1phVTFFeFduUlRhMlJxVWxad1YxWnRlRXRXTVZaSFVsUnNVVlZVTURrPQ==
拿去base64解密,刚好解了10次,得到一个网址
所以发现这里是个坑,这里不是正确的flag, 翻了一下官方的wp才知道,这个字符串是关键,当时看到off_6CC090
的时候并没有在意
试着交叉引用
这里对byte_6CC0A0[0]
和byte_6CC0A3
与v2
的第一个字符和第四个字符异或之后进行了判断也就是第一个字符和第四个字符进行判断,根据之前得到的flag
前四个字符是flag
通过该循环可以发现,v2
4字节的数,并且是随机获取的,但可以通过if
条件里面的语句反推出v2的值
if
里面的for
循环,这里每一次异或得到的值就是真正的flag
exp.py
s1 = 'flag'
v2 = []
flag = ''
enc = [0x40,0x35,0x20,0x56,0x5D,0x18,0x22,0x45,0x17,0x2F,0x24,0x6E,0x62,0x3C,0x27,0x54,0x48,0x6C,0x24,0x6E,0x72,0x3C,0x32,0x45,0x5B]
for i in range(4):
v2.append(enc[i] ^ ord(s1[i]))
for i in range(len(enc)):
flag += chr(v2[i % 4] ^ enc[i])
# flag{Act1ve_Defen5e_Test}
总结:
这道题坑的地方就在于,不知道踩坑了,也不知道是base64加密,然后就去疯狂的逆算法,最后发现是个坑,hhhhhh,考的是心态