还是搞一个本地的和云端的比较好
这次的题目比较简单,但是还是会这里那里出现一点小问题
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;
- }
这个题目是一个文件操作

写入文件操作,先是获取句柄,加载资源数据,给数据分配内存,然后把内容写入文件中,这里lpAddress就是写入的数据,
这里有一个判断,如果v7[i]不是0或者120,就异或120之后再写入,否则直接等于,这里不需要进行处理操作,等它写入文件,直接看文件的数据就行
动态调试,在c盘对应目录下找到文件
动态调试,找到如下目录:

里面搜索ou文件,用记事本打开看是MZ开头,也就是PE文件
这里出现了一个重要的问题,应该直接改后缀的,但是我把文件内容用记事本打开,然后准备新建一个exe文件,结果就出问题了!!!它一直报错,显示不是Window的文件
后面才知道是要直接将后缀改了
拿到文件就好分析了


先是一个debase64函数,解密base64
下面有一个rc4加密操作
对v33数据进行处理
接下来是一个发送网络请求的操作,不过rc4和发送网络请求的操作没有对解题没有实际作用

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


是一个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;
- }
先记到这里,最后一题是虚拟机,搞出来再补充