查壳:
![](https://img2023.cnblogs.com/blog/3074711/202305/3074711-20230509222421580-1677295113.png)
发现里边有个压缩包,弄出来看看:
![](https://img2023.cnblogs.com/blog/3074711/202305/3074711-20230509222505245-1872964989.png)
再查壳看看:
![](https://img2023.cnblogs.com/blog/3074711/202305/3074711-20230509222518960-1430574405.png)
啥也不是,把它扔进IDA:
![](https://img2023.cnblogs.com/blog/3074711/202305/3074711-20230509222616074-1022174117.png)
没有伪代码,一个字‘找’,关键点(是否IDA能成功反编译,还是说用了java的反编译才行,是否有flag或者CTF之类的字样):
![](https://img2023.cnblogs.com/blog/3074711/202305/3074711-20230509222831676-1517695722.png)
发现特殊字样,跟进:
![](https://img2023.cnblogs.com/blog/3074711/202305/3074711-20230509222852026-1493343632.png)
大写String?大胆点进jadx:
![](https://img2023.cnblogs.com/blog/3074711/202305/3074711-20230509222932202-404510978.png)
成功,告诉我们什么?要大胆点,不然会浪费很多的时间:找我们的NSSCTF吧:
![](https://img2023.cnblogs.com/blog/3074711/202305/3074711-20230509223042594-1213599280.png)
发现一个异或,先记下,继续
![](https://img2023.cnblogs.com/blog/3074711/202305/3074711-20230509223107740-2409201.png)
找到特殊字样的根源地,而且下面还有yes字样,证明这里是最终的判断:
分析程序能知道是将flag与key异或得到这特殊字样,那么我们反异或不就得到flag?
上脚本:
![](https://img2023.cnblogs.com/blog/3074711/202311/3074711-20231128200848648-267046171.png)
会给你报个越界的错误,那么怎么改呢?由于ASCII有效位最大位127,那么我们只用%128就好了
Des = '棿棢棢棲棥棷棊棐棁棚棨棨棵棢棌'
key = 123456789
flag = ''
for i in Des:
flag += chr((ord(i) ^ key) % 128)
print(flag)
得到‘jwwgpb_ETO}}`wY’???说明啥,key不对,我们再找找,看看有没有人调用改变key的值:
![](https://img2023.cnblogs.com/blog/3074711/202305/3074711-20230509223753346-1870221004.png)
在这发现有改变了key的值,最终的脚本如下:
Des = '棿棢棢棲棥棷棊棐棁棚棨棨棵棢棌'
key = 987654321
flag = ''
for i in Des:
flag += chr((ord(i) ^ key) % 128)
print(flag)
得到NSSCTF{apkYYDS}