XCTF_MOBILE5_easy-apk

附件为一个apk,先拖到模拟器看看:

 无法安装,先不管这个错误了,反编译看看。

修改apk扩展名为zip->解压->使用dex2jar对解压后的classes.dex文件进行反编译:

将反编译得到的jar文件拖进jd-gui,看MainActivity,MainActivity代码很简单:

核心就是这个if判断:

if ((new Base64New()).Base64Encode(str.getBytes()).equals("5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs="))

比较输入字符串的Base64是否等于"5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs="。

直接在Base64解密网站解密,发现解密失败,再看Base64类的名字“Base64New”,可能这里是修改过的Base64算法。

看看这个Base64New类的Base64Encode函数:

明显一看就发现,这个Base64替换表不对,我们在百度搜一个Base64解密程序,把里面的替换表换成这里修改后的替换表:

#include <stdio.h>	//注意哦,VC中""是当前路径,<>是系统路径
#include <windows.h>


const char BASE_CODE[]= {
	'v', 'w', 'x', 'r', 's', 't', 'u', 'o', 'p', 'q',
		'3', '4', '5', '6', '7', 'A', 'B', 'C', 'D', 'E',
		'F', 'G', 'H', 'I', 'J', 'y', 'z', '0', '1', '2',
		'P', 'Q', 'R', 'S', 'T', 'K', 'L', 'M', 'N', 'O',
		'Z', 'a', 'b', 'c', 'd', 'U', 'V', 'W', 'X', 'Y',
		'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
		'8', '9', '+', '/' };

//子函数 - 取密文的索引
inline char GetCharIndex(char c) //内联函数可以省去函数调用过程,提速
{
	for (int i = 0; i < strlen(BASE_CODE); i++)
	{
		if (BASE_CODE[i] == c)
		{
			return i;
		}
	}
	return 0;
}

//解码,参数:结果,密文,密文长度
int fnBase64Decode(char *lpString, char *lpSrc, int sLen)   //解码函数
{
	static char lpCode[4];
	register int vLen = 0;
	if (sLen % 4)		//Base64编码长度必定是4的倍数,包括'='
	{
		lpString[0] = '\0';
		return -1;
	}
	while (sLen > 2)		//不足三个字符,忽略
	{
		lpCode[0] = GetCharIndex(lpSrc[0]);
		lpCode[1] = GetCharIndex(lpSrc[1]);
		lpCode[2] = GetCharIndex(lpSrc[2]);
		lpCode[3] = GetCharIndex(lpSrc[3]);

		*lpString++ = (lpCode[0] << 2) | (lpCode[1] >> 4);
		*lpString++ = (lpCode[1] << 4) | (lpCode[2] >> 2);
		*lpString++ = (lpCode[2] << 6) | (lpCode[3]);

		lpSrc += 4;
		sLen -= 4;
		vLen += 3;
	}
	return vLen;
}

int main()
{
	char es[] = "5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs=";
	char ds[1000] = { 0x00 };
	fnBase64Decode(ds, es, strlen(es));
}

就可以得到答案了"05397c42f9b6da593a3644162d36eb01"。

欢迎关注我的微博:大雄_RE。专注软件逆向,分享最新的好文章、好工具,追踪行业大佬的研究成果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值