深天深天 发表于 2020-2-14 19:48

2020春节红包-第三题(复现记录WP)

本帖最后由 深天深天 于 2020-2-14 19:48 编辑

本题有两种解法
##解法一:静态分析法
**1.**jadx-gui打开MainActivity,可以发现注册了crack_j2c,
且native注册了checkFlag()和 onClick()方法

**2.**ida打开so文件分析:
先找到**init_array**段(没有初始化函数)和**jni_onload**(初始化了一些全局变量)发现没有什么内容
然后打开 function窗口可以快速找到onclick()和checkflag()方法,
(1)在onclick()方法中对输入字符串为长度为30的判断,并根据checkflag()函数返回布尔值进行Toast消息弹窗输出


(2)分析checkflag()方法【主要】
在开头有一处关于isDebuggerConnected()方法的反调试检测(但好像没起什么作用)

接下来这一部分获取字符串,这里在汇编下比较好看一点
(不知道老哥们的F5直接呈现字符串是怎么改的。。)
```
StringBuilder s1=new StringBuilder("thisiskey");
StringBuilder s2=new StringBuilder("52pojie_2020_happy_chinese_new_year");
StringBuilder s3=new StringBuilder("20200125");
```

      
(然后是v11 & 3.这句话看到直接就懵了,看了前辈们的wp后,为是否为4的倍数)
新建了一个 35 位的 Byte 数组,做一个循环,当 i 不为 0 且 i 是 4 的倍数时,下标设置为 (i >> 2) - 1,取 key3 中的值来 append 到数组中;反之,下标设置为 i,取 key2 中的值来 append 到数组中。
如果在循环结尾处下断也可以轻松得到算出来的字符 串:**52po2ie_00202hap0y_c0ine1e_n2w_y5ar**


对变形后的字符串“52po2ie_00202hap0y_c0ine1e_n2w_y5ar”进行md5加密,获取16位的byte数组

将byte数组中的元素和字符串s1取余进行逐位异或:

将得到的 byte 数组逐位转成 hex 字符串,如果小于 0xF,即只有一位,高位补 0。将结果逐位 append 到一个新的字符串中,得到一个 32 位的字符串

substring截取字符串1-31,最后与输入sn进行equals比较

脚本

```
import hashlib

key1 = "thisiskey"
key2 = "52pojie_2020_happy_chinese_new_year"
key3 = "20200125"
arr = ''

for i in range(35):
    if not i or i & 3:
      arr += key2
    else:
      arr += key3[(i >> 2) - 1]
print("1.变形(key2和key3):" + arr)

md5str = hashlib.md5(arr.encode("utf-8")).digest()
print("2.md5加密:" + str(md5str))

xorlist = []
str2 = ""
for i in range(16):
    str1 = ord(key1) ^ md5str
    xorlist.append(str1)
    str2 += hex(str1).replace("0x","")
print("3.异或(md5密文和key1):" + str(xorlist) + "#" + str2)

flag = ''
for i in range(16):
    flag += hex(xorlist).zfill(2)
print("4.hexToString:" + flag)
flag = flag
print("5.截取1-31:" + flag)
```



##解法二:hook法(这里采用frida进行hook)

frida的环境安装:https://www.52pojie.cn/forum.php?mod=viewthread&tid=93187
https://www.52pojie.cn/thread-1100931-1-1.html(自己写的~)
**1.**由解法一我们可以知道,最后在equals()方法里将输入sn和加密后的字符串做了比较,由此可以在这里hook
**2.**这里直接使用python脚本直接调试:
注意:使用python脚本需要在 **./frida-server** 启动后,
还需转发端口**adb forward tcp:27042 tcp:27042**
**3.**脚本:
脚本怎么写,请注意看官方文档:https://frida.re/docs/javascript-api/#java
frida脚本使用:

```
# 查找USB设备并附加到目标进程
process = frida.get_remote_device().attach('com.wuaipojie.crackme01')

# 在目标进程里创建脚本
script1 = process.create_script(jscode)

# 注册消息回调
# script.on('message', on_message)

# 加载创建好的javascript脚本
script1.load()

# 读取系统输入
sys.stdin.read()

def on_message(message, data):
    if message['type'] == 'send':
      print(" {0}".format(message['payload']))
    else:
      print(message)
```

jscode:

```
jscode = """
Java.perform(function(){
    var String =Java.use('java.lang.String')
    String.equals.implementation = function (arg1) {
      console.log("string is   ==》:" + this.toString());// 字符串本身
      console.log("equals arg1 ==》:" + arg1);      // equals 对象

      var ret = this.equals(v);
      return ret;
    }
});
"""
```


完整脚本:

```
import frida
import sys

jscode = """
Java.perform(function(){
    var String =Java.use('java.lang.String')
    String.equals.implementation = function (arg1) {
      console.log("string is   ==》:" + this.toString());
      console.log("equals arg1 ==》:" + arg1);      
      var ret = this.equals(v);
      return ret;
    }
});
"""

process = frida.get_remote_device().attach('com.wuaipojie.crackme01')
script1 = process.create_script(jscode)
script1.load()
sys.stdin.read()
```

hook后图像为


参考文章:
静态分析法
1.https://www.52pojie.cn/thread-1101220-1-1.html
2.https://www.52pojie.cn/thread-1101176-1-1.html
3.https://www.52pojie.cn/thread-1095089-1-1.html
hook:
1.https://www.52pojie.cn/thread-1101355-1-1.html(frida)
2.https://www.52pojie.cn/thread-1100945-1-1.html(Xposed)

其它:
参考文章
https://www.cnblogs.com/mysticbinary/p/12012935.html
https://frida.re/docs/javascript-api/
https://bbs.pediy.com/thread-226846.htm
https://www.52pojie.cn/forum.php?mod=viewthread&tid=931872
https://bbs.pediy.com/thread-246762.htm

18023999 发表于 2020-3-3 08:44

太眼花缭乱了,不过可以学习,可以让自己进步,不错不错,很给力。

深天深天 发表于 2020-3-4 01:00

zhengyg 发表于 2020-3-3 10:31
现在题目在哪里还能看到吗?搜了半天也找不到,,,

补个回复帖~
在爱盘里可以下载到:https://down.52pojie.cn/Challenge/

a897236652 发表于 2020-2-15 03:14

完全看不懂看不懂???

huchhc 发表于 2020-2-15 10:35


哎,完全看不懂

巧言乱德 发表于 2020-2-15 15:03

膜拜大佬。顺便学习{:1_893:}

cpj001 发表于 2020-2-18 15:14

我也看不懂{:301_982:}

popo2731 发表于 2020-2-20 00:53

好吧,承认我确实看不懂

shuye001 发表于 2020-2-20 16:05

还没学到这种地步

zhengyg 发表于 2020-3-3 10:31

现在题目在哪里还能看到吗?搜了半天也找不到,,,

zhengyg 发表于 2020-3-3 10:37

zhengyg 发表于 2020-3-3 10:31
现在题目在哪里还能看到吗?搜了半天也找不到,,,

找到了,谢谢
页: [1] 2 3
查看完整版本: 2020春节红包-第三题(复现记录WP)