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
#include <stdio.h>
#include <stdint.h>

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);
}
}
}