0x00 日常查壳?
安卓逆向,我用JADX
0x01 值得注意的文件
只有在这里文件里所注册的活动页 才会被手机用户观察
0x02 分析主函数
于是直接分析MainActivity
关于这些R.string.xxx都一般存储在
strings.xml存储字符串
然后现在简单分析一下:
1. 经过用户名和密码的检查
2. 密码有段加密然后 - 1的操作
比赛的时候是连vpn登陆 当时用到就是靠这个登陆
然后在资源文件里找
借鉴一下别人脚本
a = 'c232666f1410b3f5010dc51cec341f58'
for i in range(0,len(a),2):
f = a[i] + a[i+1] #加前后两个数
f = int(f,16) + 1 #转成十进制+1
print("%02x"%f,end="") #打印成16进制 打印两位 不够补0
然后解密一下获得密码
登录就送码表
0x03 分析程序流
当上面所有验证通过之后跳转到getKeyAndRedirect
这边的会开始CheckFlagActivity的操作 安卓正向开发经验不足 不过大概可以先猜key就是返回来的那串字符
跳转到这之后简单看一下发现比较flag的地方
经过EncodeUtils后和encodeFlag比较
进去一看发现又是base加密,这时候key也可以确实就是打乱的码表(没有重复的字符长度64位)
0x04 GetFlag!
解密脚本
#include <stdio.h>
#include <string.h>
int main(void)
{
unsigned char key[] = "3lkHi9iZNK87qw0p6U391t92qlC5rwn5iFqyMFDl1t92qUnL6FQjqln76l-P";
char data[] = {"TGtUnkaJD0frq61uCQYw3-FxMiRvNOB/EWjgVcpKSzbs8yHZ257X9LldIeh4APom" };
int i, j;
unsigned int v3;
int flag[100] = {0};
// printf("\n");
for(i = 0; i < 60; i++)
for(j = 0; j < 64; j++)
if(key[i] == data[j])
{
key[i] = j;
// printf("%d:%d ",i,j);
break;
}
for(i = 0, j = 0; i < 60; i += 4, j += 3)
{
v3 = key[i+3] + (key[i+2] << 6) + (key[i+1] << 12) + (key[i] << 18);
flag[j] = (v3 >> 16) & 0xFF;
flag[j+1] = (v3 >> 8) & 0xFF;
flag[j+2] = v3 & 0xFF;
}
for(i = 0; i < 100; i++)
printf("%c",flag[i]);
return 0;
}
解密脚本详情见
Buuctf-Reverse FlareOn3-Challenge Write up_水番正文的博客-CSDN博客
GetFlag!