一般来说,得到的程序如果直接的数据解不出来,且认为密文提取或者程序逻辑正确的话,也有可能数据有修改
交叉引用
一般数据的修改都可以直接交叉引用ctrl+x找另外引用的地方,出现频繁最高
TLS
最开始可能会出现tls_callback函数,先于main执行,f9之后到main,main运行结束又回到tls,一般tls会和花指令等结合,在函数列表可能也能搜到
同时注意有反调试,看上面应该是不调试获得正确密文,所以这里第一个key是5而不是6
init_function
key被修改了
#include <stdint.h> #include <stdio.h> #include <string.h> #define DELTA 0x9E3779B9 #define MX (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[(p & 3) ^ e] ^ z) void xxtea_encrypt(uint32_t *v, uint32_t len, uint32_t *k) { uint32_t n = len - 1; uint32_t y, z, sum = 0, e, p, q; q = 6 + 52 / len; while (q-- > 0) { sum += DELTA; e = sum >> 2 & 3; for (p = 0; p < n; p++) { y = v[p + 1]; z = v[p] += MX; } y = v[0]; z = v[n] += MX; } } void xxtea_decrypt(uint32_t *v, uint32_t len, uint32_t *k) { uint32_t n = len - 1; uint32_t y, z, sum, e, p, q; q = 6 + 52 / len; sum = q * DELTA; y = v[0]; while (sum != 0) { e = sum >> 2 & 3; for (p = n; p > 0; p--) { z = v[p - 1]; y = v[p] -= MX; } z = v[n]; y = v[0] -= MX; sum -= DELTA; } } int main() { uint32_t v[8] = { 3962803346,3145558623,1541010058,1093420299, 3315082129,861271549,352576336,60051825, }; uint32_t key[4] = { 1,1,4,5 }; uint32_t i; uint32_t temp[2]; for (i = 0; i < 8; i += 2){ temp[0] = v[i]; temp[1] = v[i + 1]; xxtea_decrypt(temp, 2, key); v[i] = temp[0]; v[i + 1] = temp[1]; } printf("%s", (char *)v); return 0; } //flag{GDu7Il0v3uP1zl3tm3Gr@duate}?
init_array
ctrl+s查看数据段,发现init_array有函数
函数点进去后发现有修改,前面一部分相当于特征码搜索,找到i+31的地方改为75
大概率是在tea算法中有修改
原来的0b改为4b,从add变成sub,那大概率就对了
main函数前
一般程序都是按照函数列表的顺序执行的,前面几种失效的时候可以main往上找一找,这题就是在main函数前面有关键数据
交叉引用过去找到父函数,也就是上一个,找到可能的加密逻辑,4个一循环然后相邻位置异或
去试试看,发现竟然是对的
a=[26,16,0,67,8,32,18,65,113,1,119,68,35,1,34,99,35,7,18,118,39,97,92,125] print(len(a)) for i in range(0,24,4): a[i + 2] = a[i + 2] ^ a[i + 3] a[i + 1] = a[i + 1] ^ a[i + 2] a[i]=a[i]^a[i+1] for i in range(24): print(chr(a[i]),end="") #ISCC{sSAC23Dc@Ac@cdvg@!}