ida数据修改总结

一般来说,得到的程序如果直接的数据解不出来,且认为密文提取或者程序逻辑正确的话,也有可能数据有修改

交叉引用

一般数据的修改都可以直接交叉引用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@!}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值