吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3001|回复: 6
收起左侧

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

[复制链接]
小菜鸟一枚 发表于 2022-2-1 13:49
本帖最后由 小菜鸟一枚 于 2022-2-1 13:51 编辑

前言:

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

立帖为证!--------记录学习的点点滴滴

0x1 界面分析

  1.先查壳,可以看到没有加固。

HFuuD0.png

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

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[i] & 0xFF) + 256, 16).substring(1));
        i += 1;
      }

  2.看到这,小菜鸟心里拔凉拔凉的,还用上md5了,这么复杂啊!除了md5,关键代码在这里:((StringBuffer)localObject).append(Integer.toString((paramView[i] & 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; // [sp+14h] [bp-4Ch]
  int v10; // [sp+1Ch] [bp-44h]
  int v11; // [sp+20h] [bp-40h]
  char v12[60]; // [sp+24h] [bp-3Ch] BYREF

  v9 = (char *)(*(int (__fastcall **)(int, int, _DWORD))(*(_DWORD *)a1 + 676))(a1, a3, 0);
  strcpy(v12, "ef57f3fe3cf603c03890ee588878c0ec");
  v4 = 0;
  v12[33] = 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里面分析的得很清楚,还写了脚本,是真的厉害!

免费评分

参与人数 4吾爱币 +10 热心值 +4 收起 理由
qtfreet00 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
sht281 + 1 + 1 谢谢@Thanks!
弑者 + 1 + 1 谢谢@Thanks!
user002 + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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

感谢这个兄弟!~ 很不错哟!~
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 16:43

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表