'); }

虎符_gocrypt


0x1

拖到ida7.6看,题目还比较友好,至少函数名没给抹去,理一下逻辑,就是一个xtea加密,对比函数隐藏了,得看汇编。

0x2

动调大致分析一下在干什么

image-20211020111920988

确定len=42以及flag取值范围:

flag{([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})}

接着进入加密函数内查看image-20211020112145615

原汁原味的xtea加密,在49行下断,就可以得到key的值

image-20211020112405991

0x10203,0x4050607,0x8090A0B,0x0C0D0E0F

后面看伪代码并没有找到比较比较值的位置,而且在接下来动调过程中,它会再次调用xtea加密函数,说明是两组数据进行加密,看汇编界面

image-20211020112825823

情况一目了然,进行两次xtea加密,接着进行值的对比,看比较值的函数

image-20211020113304639

获得最终的比较数据

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}

image-20211020172346511


  目录