2023香山杯re复现

还是搞一个本地的和云端的比较好

这次的题目比较简单,但是还是会这里那里出现一点小问题

w学长说:安卓的题目变化比较多,so中找函数或者资源文件里面找函数(有的main函数从so文件中加载出来)

学到的知识点:

* 文件修改可以先尝试尝试修改后缀(哭)
* 一个题目的内部文件找不到的时候,可以试试用其他工具打开
* xxtea解密脚本

#include <stdio.h>
#include <stdint.h>
#include <string.h>

#define DELTA 0x9e3779b9

void xxtea_encrypt(uint32_t *v, int n, uint32_t *key) {
    uint32_t y, z, sum;
    int p, rounds, e;
    rounds = 6 + 52 / n;
    sum = 0;
    y = v[n - 1];
    do {
        sum += DELTA;
        e = (sum >> 2) & 3;
        for (p = 0; p < n - 1; p++) {
            y = v[p + 1];
            z = v[p] += (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (key[p & 3 ^ e] ^ z);
        }
        y = v[0];
        z = v[n - 1] += (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (key[n % 4 ^ e] ^ z);
    } while (--rounds);
}

void xxtea_decrypt(uint32_t *v, int n, uint32_t *key) {
    uint32_t y, z, sum;
    int p, rounds, e;
    rounds = 6 + 52 / n;
    sum = rounds * DELTA;
    y = v[0];
    do {
        e = (sum >> 2) & 3;
        for (p = n - 1; p > 0; p--) {
            z = v[p - 1];
            v[p] -= (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (key[p & 3 ^ e] ^ z);
            y = v[p];
        }
        z = v[n - 1];
        v[0] -= (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (key[p & 3 ^ e] ^ z);
        y = v[0];
        sum -= DELTA;
    } while (--rounds);
}

int main() {
    uint32_t key[4] = {12345678 ,12398712 ,91283904 ,12378192};
    uint32_t data[] = {689085350 ,626885696 ,1894439255 ,1204672445 ,1869189675 ,475967424 ,1932042439 ,1280104741 ,2808893494};
    int data_len = sizeof(data) / sizeof(data[0]);

    printf("Original Data:\n");
    for (int i = 0; i < data_len; i++) {
        printf("%u\n", data[i]);
    }

    xxtea_decrypt(data, data_len, key);

    printf("Decrypted Data (Printable Characters):\n");
    for (int i = 0; i < data_len; i++) {
        char c = (char)data[i];
       printf("%c%c%c%c",*((char*)&data[i]+0),*((char*)&data[i]+1),*((char*)&data[i]+2),*((char*)&data[i]+3));//这个地方也是很重要的
    }
    printf("\n");

    return 0;
}


URL从哪儿来

这个题目是一个文件操作

写入文件操作,先是获取句柄,加载资源数据,给数据分配内存,然后把内容写入文件中,这里lpAddress就是写入的数据,

这里有一个判断,如果v7[i]不是0或者120,就异或120之后再写入,否则直接等于,这里不需要进行处理操作,等它写入文件,直接看文件的数据就行

动态调试,在c盘对应目录下找到文件

动态调试,找到如下目录:

里面搜索ou文件,用记事本打开看是MZ开头,也就是PE文件

这里出现了一个重要的问题,应该直接改后缀的,但是我把文件内容用记事本打开,然后准备新建一个exe文件,结果就出问题了!!!它一直报错,显示不是Window的文件

后面才知道是要直接将后缀改了

拿到文件就好分析了

先是一个debase64函数,解密base64

下面有一个rc4加密操作

对v33数据进行处理

接下来是一个发送网络请求的操作,不过rc4和发送网络请求的操作没有对解题没有实际作用

在debase64处下断点,动态调试,就出来了

hello_py

![image](assets/image-20231015183740-k7vbvfm.png)

是一个apk文件,用jadx打开,可以看到大致思路,调用pyhon语言的sayHello函数,然后进行一个判断

这些都好理解,现在最重要的就是找出sayHello函数,看看里面有哪些操作

,但是找遍了都没找到!!!!

最后在w学长提醒下搞出来在这里看到

注意!!!!这里实际上使用jeb可以直接找到(大哭!!!!!),下面使用jeb工具来看看(jeb下载4.32的最好,其他版本容易闪退)

把hello.py打开看到里里面是xxtea加密,有点混淆,但是可以看到它的特征(红色部分),下面绿色部分是加密用的key换和加密后的数据

找到了数据,下面用脚本解密

#include <stdio.h>
#include <stdint.h>
#include <string.h>

#define DELTA 0x9e3779b9

void xxtea_encrypt(uint32_t *v, int n, uint32_t *key) {
    uint32_t y, z, sum;
    int p, rounds, e;
    rounds = 6 + 52 / n;
    sum = 0;
    y = v[n - 1];
    do {
        sum += DELTA;
        e = (sum >> 2) & 3;
        for (p = 0; p < n - 1; p++) {
            y = v[p + 1];
            z = v[p] += (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (key[p & 3 ^ e] ^ z);
        }
        y = v[0];
        z = v[n - 1] += (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (key[n % 4 ^ e] ^ z);
    } while (--rounds);
}

void xxtea_decrypt(uint32_t *v, int n, uint32_t *key) {
    uint32_t y, z, sum;
    int p, rounds, e;
    rounds = 6 + 52 / n;
    sum = rounds * DELTA;
    y = v[0];
    do {
        e = (sum >> 2) & 3;
        for (p = n - 1; p > 0; p--) {
            z = v[p - 1];
            v[p] -= (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (key[p & 3 ^ e] ^ z);
            y = v[p];
        }
        z = v[n - 1];
        v[0] -= (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (key[p & 3 ^ e] ^ z);
        y = v[0];
        sum -= DELTA;
    } while (--rounds);
}

int main() {
    uint32_t key[4] = {12345678 ,12398712 ,91283904 ,12378192};
    uint32_t data[] = {689085350 ,626885696 ,1894439255 ,1204672445 ,1869189675 ,475967424 ,1932042439 ,1280104741 ,2808893494};
    int data_len = sizeof(data) / sizeof(data[0]);

    printf("Original Data:\n");
    for (int i = 0; i < data_len; i++) {
        printf("%u\n", data[i]);
    }

    xxtea_decrypt(data, data_len, key);

    printf("Decrypted Data (Printable Characters):\n");
    for (int i = 0; i < data_len; i++) {
        char c = (char)data[i];
       printf("%c%c%c%c",*((char*)&data[i]+0),*((char*)&data[i]+1),*((char*)&data[i]+2),*((char*)&data[i]+3));//这个地方也是很重要的
    }
    printf("\n");

    return 0;
}

先记到这里,最后一题是虚拟机,搞出来再补充

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值