攻防世界-Android2.0
下载链接:下载
下载apk,打开是要求输入flag,随便输入一个
载入jadx,进入程序入口
可以发现show方法中有刚才的关键字符“wrong”,要想输入great所以参数要传入1,所以JNI.getResult返回结果要是1,跟进这个方法
发现加载动态链接库,解压.apk文件找到里面的.so文件载入IDA。找到JNI_getResult。
首先进行初始化v5,v6,v7,然后对v5,v6,v7进行变化,先看init函数
int __fastcall Init(int _v5, char *_v6, char *_v7, const char *_v4, int a5)
{
int v5; // r5
int v6; // r10
int v7; // r6
if ( a5 < 1 ) // 15>1
{
v6 = 0;
}
else
{
v5 = 0;
v6 = 0;
do // 取余的不同值,进行不同操作
{
v7 = v5 % 3;
if ( v5 % 3 == 2 )
{
_v7[v5 / 3u] = _v4[v5];
}
else if ( v7 == 1 )
{
_v6[v5 / 3u] = _v4[v5];
}
else if ( !v7 )
{
++v6;
*(_BYTE *)(_v5 + v5 / 3u) = _v4[v5];
}
++v5;
}
while ( a5 != v5 );
}
*(_BYTE *)(_v5 + v6) = 0;
_v6[v6] = 0;
_v7[v6] = 0;
return _v5;
}
发现他是把v4数组的值每三个一组分别依次赋值给v5,v6,v7。
进入First
做简单异或操作前四个字符最后一个不动。
看对v6,v7操作的部分
也是简单异或,由这些可以求出原v5,v6,v7,然后根据init流程就可以求v4,代码如下
v7='AFBo}'
v6=[0x20, 0x35, 0x2D, 0x16, 0x61]
v5='LN^dl'
f5=''
f6=''
f7=''
for i in range(4):
f7+=chr(ord(v7[i])^v6[i])
f7+='}'
#print(f7)
for i in range(4):
v6[i]=v6[i]^ord(v5[i])
#print(bytes(v6))
for j in range(4):
for i in range(32,128):
if (i*2)^0x80 ==ord(v5[j]):
f5+=chr(i)
break
f5+='l'
#print(f5)
f5='fgorl'
f6='l{sra'
f7='asoy}'
flag=''
for i in range(5):
flag+=f5[i]+f6[i]+f7[i]
print(flag)
FLAG:flag{sosorryla}