落尘大大和你呢 发表于 2024-10-30 13:41

2024网鼎-Reveres-WP

##### 2024网鼎Reveres-Android-WP

#### 知识点

Java代码审计

Native层加密

###### 分析流程

jeb反编译apk找到MainActivity类
![](https://s2.loli.net/2024/10/30/FfiHk4VxXjAOg1v.png)
创建了一个按钮,判断按钮,获取到输入框的数据存储到**editText0**,**editText0**不为空的话创建了一个按钮类b
跟进去分析
![](https://s2.loli.net/2024/10/30/JBVXAIW4ajpbZci.png)
逻辑很清晰,就是从输入框中读取字符串后保存到s,判断s是否为空,传入**Check**类中的**validate**方法并把s传入进去,跟进这个**validate**方法分析
![](https://s2.loli.net/2024/10/30/fhOrqWpljJ2dEiw.png)
发现是在Native层进行的加密,那就在lib中找到这个so文件
![](https://s2.loli.net/2024/10/30/regEFkzsI7vSmjf.png)
动态注册的函数在JNI_OnLoad中看到这些数据,点进**off_11D88**分析
![](https://s2.loli.net/2024/10/30/TFHDMpa3A5N628y.png)
方法名称,方法参数类型,调用方法为**sub_75C**,跟进这个方法分析
![](https://s2.loli.net/2024/10/30/xLVOI5ysr7NuAMP.png)
先看这个函数干了些啥
![](https://s2.loli.net/2024/10/30/tN9TLXOGdmhKsli.png)
感觉像是某种加密啊,又看到byte_CC4和unk_C44数组长度是256,不是RC4就是SM4加密了,
![](https://s2.loli.net/2024/10/30/nXDoQV9jBhZGs1i.png)
感觉是key,对key进行一下变换给下面的循环用了,**aA1122357753221**就是key了,在这一串十六进制字符上点一下按R
![](https://s2.loli.net/2024/10/30/DbyusvdgPCtlrGI.png)
对**aA1122357753221**第8位开始重新赋值,双击看一下**aA1122357753221**的值**A11223577532211A**,后8位是**Z0099864**,不过这里要反过来,因为在IDA是小端存储。所以key就是**A11223574689900Z**

![](https://s2.loli.net/2024/10/30/SCGW8EuFh3tqbVI.png)

**byte_C14**就是密文了,

![](https://s2.loli.net/2024/10/30/woFXqPIk8iDVMBy.png)

提取出来直接在线解密一把梭哈

![](https://s2.loli.net/2024/10/30/toMdSW1VTvPegnO.png)
// wdflag{7314c25f-7097-483e-b745-fe96bb6a0b24}
##### 总结

Native层就是一个SM4加密,而且还是默认加密模式,无填充。
##### 2024网鼎-Reveres-ELF-WP

##### 知识点

ELF文件分析

C代码审计

基础加解密

##### 分析流程

![](https://s2.loli.net/2024/10/30/cOLSwfQ1xKN4GYs.png)

DIE分析程序发现是ELF64位的无壳程序。

IDApro打开分析

![](https://s2.loli.net/2024/10/30/W9Q51SFGRgkiMaT.png)

输入flag,判断输入长度是否为40,前7位是wdflag{最后一位是}

v20保存了{}中的数据,长度为32个,把v20的数据复制到dest中。

![](https://s2.loli.net/2024/10/30/fmrvN3iTa5dUcA1.png)

第一个加密,对dest的前8位进行乘法加密后存储到s1,再使用s1与s2作比较,如果一样则继续往下走,那么这里的s2就是密文了,在伪代码视图下s2显示的不完整,切换到汇编视图下

![](https://s2.loli.net/2024/10/30/exjoQw7H8WzJMbZ.png)

会发现密文就是这8个字节,提取出来每个字节在除以2就是明文了。

![](https://s2.loli.net/2024/10/30/JwXvLZu7kQc8G3q.png)

第二个加密,对从第8位开始到16位进行异或加密,异或key是**XorrLord**,密文是v11,同样是在汇编视图下看v11密文

![](https://s2.loli.net/2024/10/30/g6w1iVS2X4fqGeF.png)

提取出来在对key进行异或就是明文。

![](https://s2.loli.net/2024/10/30/qIx3aH47OvDMJWE.png)

第三块加密,是一个base64编码,跟进这个函数查看一下码表发现是:

**CDEFGHIJKLMNOPQRSTUVWXYZABabcdefghijklmnopqrstuvwxyz0123456789+/**

那密文就是**PVLlQVPhPFW**了,赛博厨子在线解码一下就好了

![](https://s2.loli.net/2024/10/30/tckYDRhlPny2vjV.png)
![](https://s2.loli.net/2024/10/30/eTIKc4zwfpSVyrg.png)

最后一个加密是AES加密,key是**AesMasterAesMast**,把v18的值复制给v8,在走一个for循环对v8从第8位开始赋值为8,赋值8个,这里的v8是int64类型的。

这里的v8是AES的IV,其实这里的AES是ECB模式,不需要的IV的。密文很明显就是v4了,提取出来直接在线网站解密
![](https://s2.loli.net/2024/10/30/zEBQTrlNHnvcK4b.png)
拿到最后一个明文。

把这四个明文合在一起就是flag了。

```
#include <iostream>
#include <vector>

int main() {
    // 异或的密文
    unsigned charenc_xor_value[] = { 0x39,0x5B,0x17,0x10,0x7F,0x0D,0x47,0x6, };
    char xor_key[] = "XorrLord";
    // 乘法的密文
    unsigned char start_8[] = { 0x70,0xc2,0x6c,0xca,0x6e,0x70,0x70,0x6c };
    for (size_t i = 0; i < 8; i++)
    {
      start_8 /= 2;
      printf("%c", (unsigned char)start_8);
    }

    for (int i = 0; i < 8; i++)
    {
      enc_xor_value ^= xor_key;
      printf("%c", enc_xor_value);
    }
    /*
          编码base64
      PVLlQVPhPFW
      CDEFGHIJKLMNOPQRSTUVWXYZABabcdefghijklmnopqrstuvwxyz0123456789+/
      
      AES
      AesMasterAesMast
    */

    return 0;
}
//wdflag{8a6e7886a4eb3b5b52e93a4506d28a04}
```

mystunner 发表于 2024-11-1 09:37

小白刚参加了行业内的ctf,进了决赛请了老师帮忙(收手还拿了前几名)。老师还在发愁网鼎杯能不能进决赛。难度绝对顶级。

wlzck 发表于 2024-10-30 14:56

太厉害了

shenkun 发表于 2024-10-30 15:17

牛逼牛逼

prience0118 发表于 2024-10-30 15:23

学习了。很厉害

SFign 发表于 2024-10-30 15:23

学习一波

lhhhhhh 发表于 2024-10-30 15:26

厉害,学到了。

tco2k 发表于 2024-10-30 15:31

学习了,是好文章。

oceansec 发表于 2024-10-30 15:32

厉害啊,牛逼牛逼

flyfeng0706 发表于 2024-10-30 15:34

支持,支持

bulesoft 发表于 2024-10-30 15:36

紧跟大佬步伐,努力学习
页: [1] 2 3 4
查看完整版本: 2024网鼎-Reveres-WP