0x1
拖到ida7.6看,题目还比较友好,至少函数名没给抹去,理一下逻辑,就是一个xtea加密,对比函数隐藏了,得看汇编。
0x2
动调大致分析一下在干什么
确定len=42以及flag取值范围:
flag{([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})}
接着进入加密函数内查看
原汁原味的xtea加密,在49行下断,就可以得到key的值
0x10203,0x4050607,0x8090A0B,0x0C0D0E0F
后面看伪代码并没有找到比较比较值的位置,而且在接下来动调过程中,它会再次调用xtea加密函数,说明是两组数据进行加密,看汇编界面
情况一目了然,进行两次xtea加密,接着进行值的对比,看比较值的函数
获得最终的比较数据
0x0EC311F0,0x45C79AF3,0xEDF5D910,0x542702CB
两次xtea加密,说明是四组数据(每次加密两组数据)
脚本:
#include<stdio.h>
int xtea(unsigned int x,unsigned int y,unsigned int key[],int round)
{
int i;
unsigned int v0=x,v1=y;
int delta=0x12345678;
int sum=delta*round;
for(i=0;i<round;i++)
{
v1-=(((v0<<4)^(v0>>5))+v0)^(sum+key[(sum>>11)&3]);
sum-=delta;
v0-=(((v1<<4)^(v1>>5))+v1)^(sum+key[sum&3]);
}
x=v0;y=v1;
printf("%x%x",x,y);
}
int main()
{
unsigned int arr[]={0x0EC311F0,0x45C79AF3,0xEDF5D910,0x542702CB};
unsigned int key[]={0x10203,0x4050607,0x8090A0B,0x0C0D0E0F};
for(int i=0;i<4;i+=2)
{
xtea(arr[i],arr[i+1],key,32);
}
}
//answer:3bbcf9ea29184fee8a2e201b47dfcb4e
根据要求分区间就可以得到flag:
flag{3bbcf9ea-2918-4fee-8a2e-201b47dfcb4e}