• 2023香山杯re复现


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

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

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

    学到的知识点:

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

    1. #include <stdio.h>
    2. #include <stdint.h>
    3. #include <string.h>
    4. #define DELTA 0x9e3779b9
    5. void xxtea_encrypt(uint32_t *v, int n, uint32_t *key) {
    6. uint32_t y, z, sum;
    7. int p, rounds, e;
    8. rounds = 6 + 52 / n;
    9. sum = 0;
    10. y = v[n - 1];
    11. do {
    12. sum += DELTA;
    13. e = (sum >> 2) & 3;
    14. for (p = 0; p < n - 1; p++) {
    15. y = v[p + 1];
    16. z = v[p] += (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (key[p & 3 ^ e] ^ z);
    17. }
    18. y = v[0];
    19. z = v[n - 1] += (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (key[n % 4 ^ e] ^ z);
    20. } while (--rounds);
    21. }
    22. void xxtea_decrypt(uint32_t *v, int n, uint32_t *key) {
    23. uint32_t y, z, sum;
    24. int p, rounds, e;
    25. rounds = 6 + 52 / n;
    26. sum = rounds * DELTA;
    27. y = v[0];
    28. do {
    29. e = (sum >> 2) & 3;
    30. for (p = n - 1; p > 0; p--) {
    31. z = v[p - 1];
    32. v[p] -= (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (key[p & 3 ^ e] ^ z);
    33. y = v[p];
    34. }
    35. z = v[n - 1];
    36. v[0] -= (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (key[p & 3 ^ e] ^ z);
    37. y = v[0];
    38. sum -= DELTA;
    39. } while (--rounds);
    40. }
    41. int main() {
    42. uint32_t key[4] = {12345678 ,12398712 ,91283904 ,12378192};
    43. uint32_t data[] = {689085350 ,626885696 ,1894439255 ,1204672445 ,1869189675 ,475967424 ,1932042439 ,1280104741 ,2808893494};
    44. int data_len = sizeof(data) / sizeof(data[0]);
    45. printf("Original Data:\n");
    46. for (int i = 0; i < data_len; i++) {
    47. printf("%u\n", data[i]);
    48. }
    49. xxtea_decrypt(data, data_len, key);
    50. printf("Decrypted Data (Printable Characters):\n");
    51. for (int i = 0; i < data_len; i++) {
    52. char c = (char)data[i];
    53. printf("%c%c%c%c",*((char*)&data[i]+0),*((char*)&data[i]+1),*((char*)&data[i]+2),*((char*)&data[i]+3));//这个地方也是很重要的
    54. }
    55. printf("\n");
    56. return 0;
    57. }


    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换和加密后的数据

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

    1. #include <stdio.h>
    2. #include <stdint.h>
    3. #include <string.h>
    4. #define DELTA 0x9e3779b9
    5. void xxtea_encrypt(uint32_t *v, int n, uint32_t *key) {
    6. uint32_t y, z, sum;
    7. int p, rounds, e;
    8. rounds = 6 + 52 / n;
    9. sum = 0;
    10. y = v[n - 1];
    11. do {
    12. sum += DELTA;
    13. e = (sum >> 2) & 3;
    14. for (p = 0; p < n - 1; p++) {
    15. y = v[p + 1];
    16. z = v[p] += (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (key[p & 3 ^ e] ^ z);
    17. }
    18. y = v[0];
    19. z = v[n - 1] += (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (key[n % 4 ^ e] ^ z);
    20. } while (--rounds);
    21. }
    22. void xxtea_decrypt(uint32_t *v, int n, uint32_t *key) {
    23. uint32_t y, z, sum;
    24. int p, rounds, e;
    25. rounds = 6 + 52 / n;
    26. sum = rounds * DELTA;
    27. y = v[0];
    28. do {
    29. e = (sum >> 2) & 3;
    30. for (p = n - 1; p > 0; p--) {
    31. z = v[p - 1];
    32. v[p] -= (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (key[p & 3 ^ e] ^ z);
    33. y = v[p];
    34. }
    35. z = v[n - 1];
    36. v[0] -= (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (key[p & 3 ^ e] ^ z);
    37. y = v[0];
    38. sum -= DELTA;
    39. } while (--rounds);
    40. }
    41. int main() {
    42. uint32_t key[4] = {12345678 ,12398712 ,91283904 ,12378192};
    43. uint32_t data[] = {689085350 ,626885696 ,1894439255 ,1204672445 ,1869189675 ,475967424 ,1932042439 ,1280104741 ,2808893494};
    44. int data_len = sizeof(data) / sizeof(data[0]);
    45. printf("Original Data:\n");
    46. for (int i = 0; i < data_len; i++) {
    47. printf("%u\n", data[i]);
    48. }
    49. xxtea_decrypt(data, data_len, key);
    50. printf("Decrypted Data (Printable Characters):\n");
    51. for (int i = 0; i < data_len; i++) {
    52. char c = (char)data[i];
    53. printf("%c%c%c%c",*((char*)&data[i]+0),*((char*)&data[i]+1),*((char*)&data[i]+2),*((char*)&data[i]+3));//这个地方也是很重要的
    54. }
    55. printf("\n");
    56. return 0;
    57. }

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

  • 相关阅读:
    二叉树与堆
    Oracle11G安装说明
    Linux 文件系统(二) --- vfs简单分析
    springBoot--web开发--WebMvcAutoConfiguration原理
    Linux/shell命令
    Java中InputStream写入到文件中
    新大陆!阿里 P9 整理出:Java 架构师“成长笔记”共计 23 版块
    codeblocks提示没有编译器,安装MinGW及运行heloword的方法
    Python实现简单版本的人生重开模拟器
    软件复杂性的来源与应对
  • 原文地址:https://blog.csdn.net/m0_73393932/article/details/133847290