查壳:
![](https://img2023.cnblogs.com/blog/3074711/202305/3074711-20230505163728511-2003904035.png)
64位,进IDA找主函数:
![](https://img2023.cnblogs.com/blog/3074711/202305/3074711-20230505163843474-145567813.png)
挺长的,慢慢来吧,先找正确的判断输出:涉及到了v11,又涉及到到方法sub_400E44,跟进方法看看:
![](https://img2023.cnblogs.com/blog/3074711/202305/3074711-20230505165031675-1726592655.png)
出现位运算,和aAbcdefghijklmn,跟进看看:
![](https://img2023.cnblogs.com/blog/3074711/202305/3074711-20230505165107130-1014506621.png)
标准base64编码,那就是说v11是根据v18base64加密了10次得到的,我们再看看,sub_400360的另一个参数off_6CC090,跟进:
![](https://img2023.cnblogs.com/blog/3074711/202305/3074711-20230505165404986-618488049.png)
开开心心点进去:
![](https://img2023.cnblogs.com/blog/3074711/202305/3074711-20230505165743708-2113177950.png)
真就是网址呗,让我们学习主动防御:真好这个出题人
既然这个没有,那么我们往上看,因为刚进来的时候发现几段字符串很像加密后的flag
![](https://img2023.cnblogs.com/blog/3074711/202305/3074711-20230505170052794-1946043919.png)
将这几个字符串连起来,为啥要连起来呢,因为不连起来,输出是错的(一个个试过的我,根本不成语句)这里注意,在连接前两字符串的时候,它们的末尾还要加上127这个数字得到“Iodl>Qnb(ocy\127y.i\127d`3w}wek9{iy=~yL@EC”
继续往下走,发现似乎对某段字符加密了,然后与v12对比,不同就结束。
![](https://img2023.cnblogs.com/blog/3074711/202305/3074711-20230505170709772-1569841135.png)
一个输出。那么我们先对加密后的字符串解密
上脚本:
Des = 'Iodl>Qnb(ocy y.i d`3w}wek9{iy=~yL@EC'
flag = ''
for i in range(len(Des)):
if Des[i] == ' ':
flag += chr(127 ^ i)
else:
flag += chr(ord(Des[i]) ^ i)
print(flag)
得到一条信息:Info:The first four chars are flag
,那么接下来呢?好像到头了昂,但是我们并没有得到正确的flag昂。别慌,我们再找找:
我们能仔细看看,发现在错误的网址那,出现过一段字符串,我们回去看看:(在shift+F12中也能找到类似加密的文档,需要耐心)
![](https://img2023.cnblogs.com/blog/3074711/202305/3074711-20230505181851446-2073465961.png)
在这shift+x查看调用:
![](https://img2023.cnblogs.com/blog/3074711/202305/3074711-20230505181914984-944358513.png)
发现下边有段像极了加密后的flag特别是有[]这两像极了{},我们跟进看看:
![](https://img2023.cnblogs.com/blog/3074711/202305/3074711-20230505182021614-245291236.png)
转化一下ASCII:
![](https://img2023.cnblogs.com/blog/3074711/202305/3074711-20230505182135669-1167329372.png)
在这段函数里,首先先做了两个判断:对那段内存的两个字符进行异或,看是否为'f'、'g',根据我们得到的信息,前四个字符就是flag,再加上现在的判断,得出结论:就是将输入的flag进行异或后得到那段数据:(把它异或回来得到flag)
提取出内存中存放的数据:shift+e:
上脚本咯:
Des = [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]
v4 = 'flag'
v44 = ''
flag = ''
for i in range(len(v4)):
v44 += chr(ord(v4[i]) ^ Des[i])
for i in range(len(Des)):
flag += chr(Des[i] ^ ord(v44[i % 4]))
print(flag)
得到flag{Act1ve_Defen5e_Test}收工。