小菜鸟一枚 发表于 2022-2-1 13:49

学破解第166天,《攻防世界reverse练习区android-app-100》分析

本帖最后由 小菜鸟一枚 于 2022-2-1 13:51 编辑

前言:

  坛友们,年轻就是资本,和我一起逆天改命吧,我的学习过程全部记录及学习资源:(https://www.52pojie.cn/thread-1582287-1-1.html)

**立帖为证!--------记录学习的点点滴滴**
## 0x1 界面分析
  1.先查壳,可以看到没有加固。

[!(https://s4.ax1x.com/2022/02/01/HFuuD0.png)](https://imgtu.com/i/HFuuD0)

  2.在模拟器中安装app然后运行,随便输入123456,然后回车:

![https://s4.ax1x.com/2022/02/01/HFuJ29.png](https://s4.ax1x.com/2022/02/01/HFuJ29.png)

  3.通过点击登录后返回的信息,已知的字符串信息:Just keep Trying :)。

## 0x2 静态分析
  1.看一下反编译后的apk源码
```
      Object localObject = MessageDigest.getInstance("MD5");
      ((MessageDigest)localObject).update(paramView.getBytes());
      paramView = ((MessageDigest)localObject).digest();
      localObject = new StringBuffer();
      i = 0;
      for (;;)
      {
      if (i >= paramView.length)
      {
          if ((j == 1) && (this.a.e != "unknown")) {
            this.a.c.setText("Sharif_CTF(" + ((StringBuffer)localObject).toString() + ")");
          }
          if ((j == 1) && (this.a.e == "unknown")) {
            this.a.c.setText("Just keep Trying :-)");
          }
          if (j != 0) {
            break;
          }
          this.a.c.setText("Just keep Trying :-)");
          return;
      }
      ((StringBuffer)localObject).append(Integer.toString((paramView & 0xFF) + 256, 16).substring(1));
      i += 1;
      }
```

  2.看到这,小菜鸟心里拔凉拔凉的,还用上md5了,这么复杂啊!除了md5,关键代码在这里:((StringBuffer)localObject).append(Integer.toString((paramView & 0xFF) + 256, 16).substring(1));这么长一句看不懂咋办?看我百度:

1)StringBuffer      append(type b)将 type类型参数的字符串表示附加到序列中。

2)public static String toString(int i,int radix)返回由第二个参数指定的基数中的第一个参数的字符串表示形式。

3)substring() 方法返回字符串的子字符串。substring(1)表示字符串中第二个字符到结尾的字串。

4)最后百度了& 0xFF + 256,才看到原来是byte转int字符扩展。

  3.分析错了位置,在md5加密前往回看:int j = this.a.IsCorrect(paramView);如果这里j的返回值为1,后面才会出现成功的提示,看一下public native int IsCorrect(String paramString);这个函数,发现是native层函数。

  4.通过ida加载so文件看看,找到IsCorrect函数,F5反编译看看。
```
int __fastcall Java_com_example_ctf2_MainActivity_IsCorrect(int a1, int a2, int a3)
{
int v4; // r6
int v5; // r0
int v6; // r1
char *v9; //
int v10; //
int v11; //
char v12; // BYREF

v9 = (char *)(*(int (__fastcall **)(int, int, _DWORD))(*(_DWORD *)a1 + 676))(a1, a3, 0);
strcpy(v12, "ef57f3fe3cf603c03890ee588878c0ec");
v4 = 0;
v12 = 53;
v10 = j_strcmp(v9, v12);
v5 = 1701458332;
while ( 1 )
{
    while ( 1 )
    {
      while ( 1 )
      {
      v6 = v5;
      v5 = 809244963;
      if ( v6 <= 1701458331 )
          break;
      v5 = -333293478;
      if ( v10 )
          v5 = -158041539;
      }
      if ( v6 <= 809244962 )
      break;
      (*(void (__fastcall **)(int, int, char *))(*(_DWORD *)a1 + 680))(a1, a3, v9);
      v11 = v4;
      v5 = -326599761;
    }
    if ( v6 != -158041539 )
    {
      v4 = 1;
      v5 = -158041539;
      if ( v6 != -333293478 )
      break;
    }
}
return v11;
}
```

  5.看到可疑字符串ef57f3fe3cf603c03890ee588878c0ec,可以看到strcpy函数将字符串拷贝给v12,后面没有对v12进行赋值操作,猜测这就是flag,输入验证试试,成功得到flag:Sharif_CTF(833489ef285e6fa80690099efc5d9c9d)。

## 0x3 总结
  1.这,看到一个字符串,啊这就结束了???简直不敢相信这道3分题这么容易!

  2.IDA F5功能这也太强了,看了大佬的write up里面分析的得很清楚,还写了脚本,是真的厉害!

user002 发表于 2022-2-1 14:07

感谢分享~

弑者 发表于 2022-2-1 15:04

学习学习学习

lxptyc 发表于 2022-2-1 16:38

sht281 发表于 2022-2-2 08:31

很好的教材,多谢

EastRabbit 发表于 2022-2-2 14:44

加油,看好你

huzhou 发表于 2022-2-4 10:16


感谢这个兄弟!~ 很不错哟!~
页: [1]
查看完整版本: 学破解第166天,《攻防世界reverse练习区android-app-100》分析