2022年HGAME中REVERSE的creakme
下载附件,照例扔入 exeinfope 中查看信息:
.
.
32 位无壳,照例扔入 IDA 32中查看信息,有 main 函数看main 函数:
.
.
那么直接给出解密脚本:
#include <stdio.h>
#include <stdint.h>
void decrypt (uint32_t* v, uint32_t* k) {
uint32_t v0=v[0], v1=v[1], sum=1183502080, i; //这里的sum=32*delta,但是注意溢出的截取,否则就错了
uint32_t delta=305419896;
uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3];
for (i=0; i<32; i++) {
v1 -= ((v0<<4) + k0) ^ (v0 + sum) ^ ((v0>>5) + k1)^sum;
v0 -= ((v1<<4) + k2) ^ (v1 + sum) ^ ((v1>>5) + k3)^sum;
sum -= delta;
}
v[0]=v0; v[1]=v1;
}
int main()
{
uint32_t v[4][2]={{0x48D93488,0x30C144C},{0x52EB78C2,0xED9CE5ED},{0xAE1FEDE6,0xBA5A126D},{0xCF9284AA,0x65E0F2E3}};
uint32_t k[4]={0x44434241,0x48474645,0x4c4b4a49,0x504f4e4d};
// v为要加密的数据是两个32位无符号整数
// k为加密解密密钥,为4个32位无符号整数,即密钥长度为128位
printf("加密前原始数据:%u %u\n",v[0],v[1]);
for(int i=0;i<4;i++)
decrypt(v[i],k);
for (int a = 0; a < 4; a++)
{
for (int b = 0; b < 2; b++)
{
for(int c=0; c<4; c++)
printf("%c", (v[a][b] >> (c * 8)) & 0xFF); //C语言32位数字符拼接
}
}
return 0;
}
.
.
解毕!
敬礼!