2021 SangFor(羊城杯)-Reverse(逆向) Ez_Android Write up

0x00 日常查壳?

安卓逆向,我用JADX

0x01 值得注意的文件

只有在这里文件里所注册的活动页 才会被手机用户观察

2021 SangFor(羊城杯)-Reverse(逆向) Ez_Android Write up_第1张图片

0x02 分析主函数

于是直接分析MainActivity

2021 SangFor(羊城杯)-Reverse(逆向) Ez_Android Write up_第2张图片

关于这些R.string.xxx都一般存储在

strings.xml存储字符串

2021 SangFor(羊城杯)-Reverse(逆向) Ez_Android Write up_第3张图片

然后现在简单分析一下:

1. 经过用户名和密码的检查

2. 密码有段加密然后 - 1的操作

比赛的时候是连登陆 当时用到就是靠这个登陆

然后在资源文件里找

借鉴一下别人脚本

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

然后解密一下获得密码

2021 SangFor(羊城杯)-Reverse(逆向) Ez_Android Write up_第4张图片

登录就送码表

0x03 分析程序流

当上面所有验证通过之后跳转到getKeyAndRedirect

2021 SangFor(羊城杯)-Reverse(逆向) Ez_Android Write up_第5张图片

这边的会开始CheckFlagActivity的操作 安卓正向开发经验不足 不过大概可以先猜key就是返回来的那串字符

2021 SangFor(羊城杯)-Reverse(逆向) Ez_Android Write up_第6张图片

跳转到这之后简单看一下发现比较flag的地方

经过EncodeUtils后和encodeFlag比较

2021 SangFor(羊城杯)-Reverse(逆向) Ez_Android Write up_第7张图片

进去一看发现又是base加密,这时候key也可以确实就是打乱的码表(没有重复的字符长度64位)

2021 SangFor(羊城杯)-Reverse(逆向) Ez_Android Write up_第8张图片

0x04 GetFlag!

解密脚本

#include 
#include 

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!

你可能感兴趣的:(Reverse,android)