creakme2
进来看看

流程很短,主要应该都是集中在了几个sub_14000的函数里面

看到各种偏移和异或,推测为tea的变种
而

9E3779B1,不是标准的delta数,再仔细看看流程
动调输入任意数据,弹出报错

进入汇编查看,在函数内部发现

seh异常处理标志
通过exception,跟进filter 函数

发现在这里有一个对寄存器比较的操作

检索一下0C0000094h是什么数据
内核学习-异常处理 - 网安 (wangan.com)

除零异常,和上面弹出的警示一致
返回try块检查异常变更

可以看到这边用sum和0x12345进行了异或
当被除数为0的时候 (idiv处)
也就是sum>>31为零的时候,抛出除数异常
那就可以直接开写了,这个也没有什么太多不一样的,魔改的xtea
因为sum发生了变化,直接改改

抄了个通用脚本ww
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
|
void decipher(uint32_t v[2], uint32_t const key[4]) { unsigned int i; uint32_t v0=v[0], v1=v[1], delta=0x9E3779B1, sum=0xc78e4d05; for (i=0; i <32; i++) { v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]); if(sum>>31==0) { sum^=0x1234567; } sum -= delta; v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]); } v[0]=v0; v[1]=v1; } int main() { uint32_t v[4][2]={{0x457E62CF, 0x9537896C},{ 0x1F7E7F72, 0xF7A073D8}, {0x8E996868, 0x40AFAF99}, {0x0F990E34, 0x196F4086}}; uint32_t const k[4]={1,2,3,4}; for(int i =0;i<4;i++) { decipher( v[i], k); for (int j = 0; j < 2; j++) { for(int k=0; k<4; k++) printf("%c", (v[i][j] >> (k * 8)) & 0xFF); } } }
|