1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
| #include <stdio.h> #include <string.h> #include <stdint.h> #define MX (((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4)) ^ ((sum ^ y) + (key[(p & 3) ^ e] ^ z))) typedef unsigned char BYTE; unsigned char aLaughterIsPois[] = "Laughter_is_poison_to_fear"; unsigned char xor_xtea_num[48] = {0xDA, 0x30, 0x23, 0xE3, 0xDC, 0x39, 0x82, 0x60, 0xA5, 0x44, 0x68, 0xC2, 0x43, 0x7A, 0xBB, 0xE4, 0x50, 0xE1, 0x02, 0xC2, 0x81, 0x59, 0xEA, 0x1E, 0xC6, 0x8B, 0x71, 0x38, 0x27, 0x83, 0x94, 0xD8, 0xF4, 0x8D, 0x1A, 0x2A, 0x56, 0x8A, 0x4A, 0xD4, 0x54, 0xDC, 0x24, 0x3F, 0xB9, 0xED, 0x7B, 0x9A}; unsigned char xor_xxtea_num[48] = {0x8f, 0x6c, 0xa6, 0x3f, 0x94, 0x3d, 0xf5, 0xd9, 0x36, 0x66, 0x51, 0xd7, 0x66, 0x2f, 0xb3, 0x8f, 0xc0, 0x61, 0x9e, 0xce, 0xe9, 0xd7, 0xe1, 0xbf, 0x13, 0x14, 0x16, 0x14, 0xc2, 0xe7, 0xc3, 0x3a, 0x7f, 0x94, 0xa1, 0xe7, 0x24, 0x0e, 0xa7, 0x5c, 0xd3, 0x77, 0xfe, 0x4f, 0x11, 0xdc, 0x69, 0x23}; void xtea_decrypt(unsigned char *data, size_t length) { for (int i = 0; i < 48; i++) { data[i] ^= xor_xtea_num[i]; } unsigned int *v = (unsigned int *)data; unsigned char key_xtea[] = "{you_find_it_!?}"; unsigned int *v8 = (unsigned int *)key_xtea; for (int l = 0; l < 12; l += 2) { unsigned int v6 = v[l], v5 = v[l + 1], v4 = 0; unsigned int delta = 0x61C88647; v4 = -1 * 32 * delta; for (int i = 0; i < 32; i++) { v5 -= (v8[(v4 >> 11) & 3] + v4) ^ (((v6 >> 5) ^ (16 * v6)) + v6); v4 += delta; v6 -= (v8[v4 & 3] + v4) ^ (((v5 >> 5) ^ (16 * v5)) + v5); } v[l] = v6; v[l + 1] = v5; } for (int i = 0; i < 48; i++) { data[i] ^= aLaughterIsPois[i % 26]; } } void xxtea_decrypt(uint8_t *data) { for (int i = 0; i < 48; i++) { data[i] ^= xor_xxtea_num[i]; } int n = -12; uint32_t *v = (uint32_t *)data; unsigned char *key_xxtea = "{What_is_this_?}"; uint32_t *key = (unsigned int *)key_xxtea; uint32_t y, z, sum; unsigned p, rounds, e; unsigned int delta = 0x11451419; if (n > 1) { rounds = 6 + 52 / n; sum = 0; z = v[n - 1]; do { sum += delta; e = (sum >> 2) & 3; for (p = 0; p < n - 1; p++) { y = v[p + 1]; z = v[p] += MX; } y = v[0]; z = v[n - 1] += MX; } while (--rounds); } else if (n < -1) { n = -n; 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]; y = v[p] -= MX; } z = v[n - 1]; y = v[0] -= MX; sum -= delta; } while (--rounds); } } int main() { unsigned char data[48] = {0x18, 0x09, 0x1C, 0x14, 0x37, 0x1D, 0x16, 0x2D, 0x3C, 0x05, 0x16, 0x3E, 0x02, 0x03, 0x10, 0x2C, 0x0E, 0x31, 0x39, 0x15, 0x04, 0x3A, 0x39, 0x03, 0x0D, 0x13, 0x2B, 0x3E, 0x06, 0x08, 0x37, 0x00, 0x17, 0x0B, 0x00, 0x1D, 0x1C, 0x00, 0x16, 0x06, 0x07, 0x17, 0x30, 0x03, 0x30, 0x06, 0x0A, 0x71}; xxtea_decrypt(data); xtea_decrypt(data, 48); for (int i = 0; i < 48; i++) { printf("%c", data[i]); } } #DASCTF{You_come_to_me_better_than_all_the_good.}
|