小伙伴发来一道安卓的ctf题目,简单记录一下解题过程,一个apk和安装截图,我就不安装了,使用JEB或者反编译为jar用jd-gui打开都行,定位到MainActivity下:

关键代码中的关键判断:

要想验证成功,str.charAt(j) 的值必须等于 paramAnonymousView.charAt(j) ^ i,跟踪str、j、paramAnonymousView和i的值,画个图:

所以,成功的条件是:用户的输入等于versionName的值的每一位和versionCaode异或的结果。查一下getPackageManager()的getPackageInfo():

 所以,com.example.yaphetshan.tencentgreat和 16384并不是versionName和versionCode的值(可能会造成误区),浏览一下,在BuildConfig中:

即X<cP[?PHNB<P?aj的每一位和15进行异或运算,简单写个py如下:

a=0x0f  #15
b=[0x58,0x3c,0x63,0x50,0x5b,0x3f,0x50,0x48,0x4e,0x42,0x3c,0x50,0x3f,0x61,0x6a] #X<cP[?PHNB<P?aj
flag=''
for j in b:
	flag +=chr(a^j)
	print(flag)

 为啥要一位加一位输出,不知道为啥,感觉看起来好舒服的亚子。。。

 结果为W3l_T0_GAM3_0ne。

02-10 04:21