平台WP · 2022年10月16日

easy_androidRe

easy_androidRe

打开附件,发现是一个java文件,还没有打包,所以可以通过文本编辑工具直接打开(记事本、notepad++等)打开之后即可看到源代码。

image-20221016100345407

开始对代码进行分析,从最显眼的“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}