easy_androidRe
打开附件,发现是一个java文件,还没有打包,所以可以通过文本编辑工具直接打开(记事本、notepad++等)打开之后即可看到源代码。
开始对代码进行分析,从最显眼的“You input is”开始,后面将获取的字符串放入了Encrypt函数中进行加密和验证。所以很显然,Encrypt这个函数就是我们主要需要分析的加密函数了
代码逻辑很清晰,第一步对获取的数组中每个元素加64并异或0x20,运算结束后与keylist进行比较。如果相同则输出恭喜,否则输出错误。而keylist是由key生成的。所以我们已知了keylist的值,于是就可以像解方程一样解出flag的值
写解题脚本
python 版
key = [142, 153, 142, 149, 131, 148, 134, 191 ,137 ,147,191,137,142,148,133,146,133,147,148,137,142,135]
for i in key:
print(chr((i^0x20)-64),end="")
c++版
#include<iostream>
using namespace std;
int main()
{
int key[] = {142, 153, 142, 149, 131, 148, 134, 191 ,137 ,147,191,137,142,148,133,146,133,147,148,137,142,135};
for(int i = 0; i < sizeof(key)/4 ; i ++)
//sizeof 用于获取数组所占存储空间大小,每个int型元素占四字节,故占用的存储空间除以4即为元素个数
{
cout << (char)((key[i] ^ 0x20)-64) ;
}
return 0;
}
运行结果包上nynuctf得到flag:nynuctf{nynuctf_is_interesting}