吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4376|回复: 5
上一主题 下一主题
收起左侧

[Android CTF] 《攻防世界》MOBILE--首题--easy-so

  [复制链接]
跳转到指定楼层
楼主
HNHuangJingYU 发表于 2021-9-30 10:27 回帖奖励
本帖最后由 HNHuangJingYU 于 2021-9-30 10:32 编辑

首先将easy-so.apk拉进jeb进行静态分析:
1.入口界面发现只有一个so层的函数进行判断输入,嗯解题思路很明显

2.将so拉进IDA进行分析,根据so层的函数加密逆向过来,因为是静态函数所以很容易就找到,对CheckString函数进行分析(大多数思路我都会在代码旁边进行注释,大家看代码就行)

3. 再来到j_TestDec函数、再进去TestDec函数,代码加密其实就是两个循环进行位置互换,因为只是位置互换所以我们只要按着顺序去倒回来就行(逆向算法大概都是这种思路)
[C++] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
size_t __fastcall TestDec(const char *a1)
{
  char *string; // r4
  size_t index; // r5
  int v3; // r1
  unsigned __int8 v4; // r0
  size_t result; // r0
  int index2; // r5
  int v7; // r0
  unsigned __int8 v8; // r1
  unsigned int v9; // r1
 
  string = a1;
  if ( strlen(a1) >= 2 )                        // 字符长度至少2位
  {
    index = 0;
    do
    {
      v3 = &string[index];                      // 取字符串单个的地址
      v4 = string[index];
      string[index] = string[index + 16];
      ++index;
      *(v3 + 16) = v4;                          // 将v4赋值给在地址16个单元处的单元值
    }
    while ( index < strlen(string) >> 1 );      // 索引自增后是否小于右移后的字符长度
  }
  result = *string;                             // *string 等价于 stirng[0]
  if ( *string )                                // string[0]  不为0
  {
    *string = string[1];                        // 这里索引0和索引1进行位置变换
    string[1] = result;
    result = strlen(string);
    if ( result >= 3 )
    {
      index2 = 0;
      do
      {
        v7 = &string[index2];
        v8 = string[index2 + 2];                // 这里的逻辑也是对字符串进行位置交换
        *(v7 + 2) = string[index2 + 3];         // 这里因为v7被赋值了&string[index]所以v7这里是地址,然后取地址+2个单元的数据值那么就是string[inex+2]
        *(v7 + 3) = v8;
        result = strlen(string);
        v9 = index2 + 4;
        index2 += 2;
      }
      while ( v9 < result );
    }
  }
  return result;
}

4. 算法还原:
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
@Test
    public void demo1() {
        String data = "f72c5a36569418a20907b55be5bf95ad";
        char[] chars = data.toCharArray();
        int index2 = 0;
        int result;
        int v9;
        char v8;
        do {
            v8 = chars[index2 + 2];
            chars[index2 + 2] = chars[index2 + 3];
            chars[index2 + 3] = v8;
            result = chars.length;
            v9 = index2 + 4;
            index2 += 2;
        }
        while (v9 < result);
        result = chars[0];
        chars[0] = chars[1];
        chars[1] = (char) result;
 
        int index = 0;
        char v4;
        do {
            v4 = chars[index];
            chars[index] = chars[index + 16];
            chars[index + 16] = v4;                          // 将v4赋值给在地址16个单元处的单元值
            ++index;
        }
        while (index < chars.length >> 1);
        System.out.println("得到flag");
        System.out.println(chars);
    }
 
        //得到flag  90705bb55efb59da7fc2a5636549812a

下次尽量用C/C++写脚本,C++基础太重要了

免费评分

参与人数 1威望 +1 吾爱币 +20 热心值 +1 收起 理由
qtfreet00 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

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

沙发
zhanglei0546 发表于 2021-9-30 14:03
感谢分享
3#
aonima 发表于 2021-9-30 20:16
4#
xunxunmimi0936 发表于 2021-10-1 14:23
5#
坎德沃 发表于 2021-10-8 09:53
感谢楼主的细致教程,另外我很想知道这些逆算法是怎么思考出来的,然后如果要提升这方面怎么去学
6#
wantwill 发表于 2021-10-19 17:20

感谢分享!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2025-10-9 04:59

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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