(非官方解,以下内容均互联网收集的信息和个人思路,仅供学习参考)
Badcode

输入的字符串进行了三次加密,最后再与预期的flag密文进行对比
第一次循环:
- 遍历 v17 数组的每个字节。
- 根据字节索引的奇偶性,将字节的值加 2 或减 3。
第二次循环:
- 遍历 v17 数组的每个字节。
- 将 v16 数组对应位置的字节减去 48,然后与当前字节进行异或运算。
- 将异或结果存储回 v17 数组。
第三次的加密有三个传参,点进函数看一下
XTEA 加密,密钥是 &unk_977018
取出来密文和密钥进行解密即可
#include <stdio.h> #include <stdint.h> #define DELTA 0x9e3779b9
#define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key(p\&3)\^e ^ z))) #include <iostream>
using namespace std;
void btea(uint32_t *v, int n, uint32_t const key4) { uint32_t y, z, sum;
unsigned p, rounds, e;
if (n > 1) {
rounds = 6 + 52 / n; sum = 0;
z = vn - 1;
do {
sum -= DELTA;
e = (sum >> 2) & 3;
for (p = 0; p < n - 1; p++) {
y = vp + 1;
z = vp += MX;
}
y = v0;
z = vn - 1 += MX;
} while (--rounds);
} else if (n < -1) { n = -n;
rounds = 6 + 52 / n; sum = rounds * DELTA; y = v0;
do {
e = (sum >> 2) & 3;
for (p = n - 1; p > 0; p--) { z = vp - 1;
y = vp -= MX;
}
z = vn - 1;
y = v0 -= MX; sum -= DELTA;
} while (--rounds);
}
}
int main() {
uint32_t key4 = {0x12345678, 0x9ABCDEF0, 0xFEDCBA98, 0x76543210}; uint32_t v\[\] = { 0x3881C7CA, 0x5AEA661A, 0xC0E1397D, 0x3C415BB1, 0xDC546CB9,
0x5DC6BE6 };
btea(v, -6, key); string a = (char *)v; int v1624; srand(0x18u);
for (int i = 0; i < 24; ++i ) {
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| v16i = rand() % 10 + 48; } for (int k = 0; k < 24; ++k ) { ak ^= (v16k - 48); } for (int j = 0; j < 24; ++j ) { if ( j % 2 ) { aj -= 2; } else { aj += 3; } } for (int i = 0; i < 24; i++) { cout << (char)ai; } |
|---|
| } |
运行脚本时要注意一下 v\[\] 的变化