链接:https://pan.baidu.com/s/1_BHVmOej_oIT3kp5A8Zu9Q
提取码:tuyt

题解HGAME2022 creakme

image-20220405164603007

发现这种格式,就想起tea加密,但是很容易发现,这里的sum值改了,而且在v0和v1这里多加了一个异或,得知这是一个魔改的tea

做tea的题目我们需要去寻找key和明文

image-20220405164658645

这里的while语句就知道我们的明文是跟这个v11(这里是拿输入的东西与v11+sum进行比较如果一样就是正确的)有关的于是我们去看v11是什么

image-20220405164753479

发现是这个,明文找到了,但还要确定这个明文是怎样进去tea解密的循环的

image-20220405164904857

我们可以从这里发现它这是是相当于v0为前四个字节,v1为后四个字节进行输入,然后循环了四次(i=v8+8),然后我们就知道v[8]={0X48D93488,0X030C144C,0X52EB78C2,0XED9CE5ED,0XAE1FEDE6,0XBA5A126D,0XCF9284AA,0X65E0F2E3}(两组两组一取,总共分成了八个小段,因为这个v0和v1是char类型四个字节,先从后面取,按顺序!)

然后我们去找密匙key,

image-20220405165015779

因为tea加密的原理,我们只需要取四组为key就行所以key为k[4]={0X44434241,0X48474645,0X4C4B4A49,0X504F4E4D}(key长度为128位)

然后我们开始写写脚本

image-20220405165118499

#include <stdio.h>
#include <stdint.h>
void decrypt (uint32_t* v, uint32_t* k)
{
uint32_t delta=0x12345678;
uint32_t v0=v[0], v1=v[1], sum=delta<<5, i;
uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3];
for (i=0; i<32; i++)
{
v1 -= sum^((v0<<4) + k0) ^ (v0 + sum) ^ ((v0>>5) + k1);
v0 -= sum^((v1<<4) + k2) ^ (v1 + sum) ^ ((v1>>5) + k3);
sum -= delta;
}
v[0]=v0; v[1]=v1;
}
int main()
{
uint32_t v[8]={0X48D93488,0X030C144C,0X52EB78C2,0XED9CE5ED,0XAE1FEDE6,0XBA5A126D,0XCF9284AA,0X65E0F2E3}, k[4]={0X44434241,0X48474645,0X4C4B4A49,0X504F4E4D};
for(int i=0;i<8;i+=2)
{
decrypt(v+i,k);
}
printf("%s",v);
return 0;
}

得到flag:

hgame{H4ppy_v4c4ti0n!}