Rating:

#### 出题思路
首先很明显这是一个指令抽取壳,dex文件中指令丢失,在so中还原。
用到的是`inline-hook`,hook`libdvm.so`的`dexFindClass`,在加载类时进行指令还原

抽取的指令,和一些字符串进行加密保存,在`.init`段进行了自解密,算法为rc4,密钥为`havefun`

指令还原后完整的dex执行逻辑为,将`SCTF`类的`b`字段作为密钥,将输入的字符串进行`xxtea`加密后与`SCTF`类的`c`字段比较

值得注意的是在`JNI_OnLoad()`时替换了`SCTF`中的`b`,`c`字段

#### 解题方法
1. 硬逆so层,还原字节码
2. 众所周知,app既然要运行起来,代码必将加载到内存。所以可以在适当时间将完整的dex从内存中dump出来
本题可在`d.a.c`的`public static String a(String arg1, String arg2, String arg3)`方法(点击play按钮后该方法的字节码会加载到内存)`o1`方法执行后`o2`方法执行前将dex dump

### get_up
第一层smc的秘钥经测试在大部分在线工具站都可以查到
![](http://roomoflja.cn/wp-content/uploads/2020/07/upload_3da6d43a46b537c4dfcae58d416047e4.jpg)
第二层秘钥用了flag前5位`SCTF{`做秘钥

然后进行常规的rc4算法对flag进行加密,rc4秘钥是`syclover`并用其他逻辑运算代替异或来完成数据交换
```cpp
{
i = (i + 1) % 256;
j = (j + s[i]) % 256;
s[i] = (s[i] & ~s[j]) | (~s[i] & s[j]);
s[j] = (s[i] & ~s[j]) | (~s[i] & s[j]);
s[i] = (s[i] & ~s[j]) | (~s[i] & s[j]);
t = (s[i] + s[j]) % 256;
data[k] ^= s[t];
//printf("%2.2x,", data[k]);
}
```

解密只要输入格式符合的字符串再拿到该字符串的密文就可写脚本了

```python
d=[128, 85, 126, 45, 209, 9, 37, 171, 60, 86, 149, 196, 54, 19, 237, 114, 36, 147, 178, 200, 69, 236, 22, 107, 103, 29, 249, 163, 150, 217]
s=[128, 85, 126, 45, 209, 18, 62, 176, 35, 31, 136, 150, 12, 45, 211, 76, 24, 173, 161, 202, 16, 210, 66, 101, 89, 25, 172, 177, 142, 197]
s1='SCTF{aaaaaaaaaaaaaaaaaaaaaaaaa'#输入的flag
for i in range(len(s)):
print(chr(d[i]^s[i]^ord(s1[i])),end='')
# SCTF{zzz~(|3[___]_rc4_5o_e4sy}

```