题目
查壳
先查壳(PKiD等),有壳脱壳,没壳用AndroidKiller等反编译工具打开查看JAVA代码
无壳APK
Java Decompiler - MainActivity-onCreate
答案
Writeup
解题
运行
解题思路
搜索字符串
使用反编译工具的字符串搜索功能,搜索运行后失败的提示字符串(转化为Unicode)“再接再厉”:
在Java Decompiler中,找到该class文件查看代码。
MainActivity
搜不出来或者没有思路时,应该先看Android程序的入口——也就是MainActivity函数。
代码逻辑
MainActivity
public void onClick(View paramAnonymousView)
{
for (;;)
{
try
{
str1 = MainActivity.this.text.getText().toString();
paramAnonymousView = MainActivity.this.getPackageManager().getPackageInfo("com.example.yaphetshan.tencentgreat", 16384);
str2 = paramAnonymousView.versionName;
int i = paramAnonymousView.versionCode;
j = 0;
if ((j >= str1.length()) || (j >= str2.length()))
{
continue;
}
if (str1.charAt(j) != (str2.charAt(j) ^ i))
{
Toast.makeText(MainActivity.this, "再接再厉,加油~", 1).show();
return;
}
}
catch (PackageManager.NameNotFoundException paramAnonymousView)
{
String str1;
String str2;
int j;
Toast.makeText(MainActivity.this, "年轻人不要耍小聪明噢", 1).show();
continue;
}
j++;
continue;
if (str1.length() != str2.length())
{
continue;
}
Toast.makeText(MainActivity.this, "恭喜开启闯关之门!", 1).show();
}
};
核心逻辑为:
if (str1.charAt(j) != (str2.charAt(j) ^ i))
str2为密文,i为密钥,赋值代码为:
paramAnonymousView = MainActivity.this.getPackageManager().getPackageInfo("com.example.yaphetshan.tencentgreat", 16384);
str2 = paramAnonymousView.versionName;
int i = paramAnonymousView.versionCode;
packageManager.getPackageInfo
值被藏在的包信息(PackageInfo)中,通过“getPackageManager().getPackageInfo”获取包信息结构体,而后获取其中的“versionName”=“X
解题方法
【🐷偷懒高效推荐💤】在线编码转化
- 使用CyberChef的XOR异或功能
- Key的类型选十进制的Decimal,填“15”(默认选Hex,填F)
- 得flag&input=WDxjUFs/UEhOQjxQP2Fq):
【👩💻练Python推荐⌨】Python脚本🐍
def Xor(str):
key = 15
strXOR = ""
for i in range(len(str)):
strXOR += chr(ord(str[i]) ^ key)
return strXOR
strEncode ="X<cP[?PHNB<P?aj"
flag = Xor(strEncode)
print("Flag:" + flag)