攻防世界-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}