本文主要是介绍2023香山杯re复现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
还是搞一个本地的和云端的比较好
这次的题目比较简单,但是还是会这里那里出现一点小问题
w学长说:安卓的题目变化比较多,so中找函数或者资源文件里面找函数(有的main函数从so文件中加载出来)
学到的知识点:
* 文件修改可以先尝试尝试修改后缀(哭)
* 一个题目的内部文件找不到的时候,可以试试用其他工具打开
* xxtea解密脚本
#include <stdio.h>
#include <stdint.h>
#include <string.h>#define DELTA 0x9e3779b9void 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

是一个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 0x9e3779b9void 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;
}
先记到这里,最后一题是虚拟机,搞出来再补充
这篇关于2023香山杯re复现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!