一般来说,得到的程序如果直接的数据解不出来,且认为密文提取或者程序逻辑正确的话,也有可能数据有修改
交叉引用
一般数据的修改都可以直接交叉引用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@!}