弱口令安全实验室2022招新赛

分析

首先查壳,知道是64位的的无壳

image-20221120133729442

然后放入IDA中去看看

image-20221120133815080

image-20221120133856077

看到这里有一个加密函数,进去看一下

image-20221120133928938

左右的移位和格式很容易推断出是一个TEA的魔改,然后再去看看外面的逻辑

从外头整个函数来看,可以知道这个是先加密v4然后再进行比对再移位来得到right,那么脚本反过来写就行了

脚本

#include <stdio.h>
#include <stdint.h>
#include<windows.h>
unsigned long str2[32] ={46,162,154,93,216,119,117,77,224,124,80,69,114,165,248,93,109,14,98,20,102,95,216,91,138,93,196,200,116,32,253,101};
unsigned int key[4]={1,2,3,4};
void decrypt(unsigned int *A,unsigned int *B)
{
int j;
unsigned int v0 = A[0],v1 = A[1],delta = 221492336,sum = delta <<5;
for(j=0;j<32;j++)
{
v1 -= (v0 + sum) ^ (B[2] + 16 * v0) ^ ((v0 >> 5) + B[3]);
v0 -= (v1 + sum) ^ (*B + 16 * v1) ^ ((v1 >> 5) + B[1]);
sum -= delta;
}
A[0] = v0; A[1] = v1;
}
unsigned int v4[2];
int main()
{
for ( int i = 24; i >= 0; i -= 8 )
{
for (int j = 0; j <= 1; ++j )
{
v4[j]=0;//看汇编知道最后的v4得到right!之后值为0
for (int k = 3; k >=0 ; --k )
{
v4[j] = v4[j] << 8;//交换大小端
v4[j] += str2[4 * j + i + k];
}
}
decrypt(&v4[0],key);//解密4次
for (int j = 0; j <= 1; ++j )
{
for (int k = 0; k <= 3; ++k )
{
str2[4 * j + i + k]=v4[j] ;
v4[j] = v4[j] >> 8;
}
}
}
for(int i=0;i<32;i++)
printf("%c",str2[i]);
return 0;
}
//4fe6818d59b8c6ca7cf055b2f12f8d27
PS:脚本中i和第一次的k的循环为什么是做减法是因为前面做了一次移位进行了大小端的呼唤所以就从不同的位进行换值。最后的两个for循环是将它再一次交换大小端换回来得到flag值