0x1
其实就是一个简单的xtea,并没有做任何修改,但是前面的各种阻碍
比较难受。
0x2
开始是最大的一个坑点,长度限制只有一个,就是不能等于16,需要修改一下跳转
但是等到后面调试的时候,才知道知道这里需要进行修改
接下来会随机生成两个数,并只取十进制状态下的最后一位,然后rand2需要比rand1的值小,才能继续运行程序
满足条件后,会经过一个函数,动调可以发现返回的值就是对应次方后的最后一位值,后面进行对比,可以修改跳转通过这里,或者将值获取出来
值:rand1=4,rand2=2
接下来会跳转到Sleep,一直暂停,这里需要将它nop掉
这里是nop后
addr=[0x7FF6DF3D30F6,0x7FF6DF3D3101]
for i in range(addr[0],addr[1]):
ida_bytes.patch_byte(i,0x90)
然后通过查看内存的方式,获取xtea的key的四个值
0x67932,0x4F765,0x7FAFF,0x67932
然后搓脚本
#include
int xtea(unsigned int x,unsigned int y,unsigned int key[],int round)
{
int i;
unsigned int v0=x,v1=y;
int delta=0x9E3779B9;
int sum=delta*round;
for(i=0;i>5))+v0)^(sum+key[(sum>>11)&3]);
sum-=delta;
v0-=(((v1<<4)^(v1>>5))+v1)^(sum+key[sum&3]);
}
x=v0;y=v1;
printf("%c%c",x,y);
}
int main()
{
unsigned int arr[]={0x0D118C7B2,0x7FC3F3A8,0x4A19F2DA,0x472469E1,0x7C682864,0x50C0E3D1,0x0C595670B,
0x2EE07578,0x0D040A3F0,0x0C5590286,0x0D82B07A8,0x0D5978C2C,0x4E2BC556,0x79E2E90,
0x0C7A353B5,0x493995B};
unsigned int key[]={0x67932,0x4F765,0x7FAFF,0x67932};
for(int i=0;i<16;i+=2)
{
xtea(arr[i],arr[i+1],key,32);
key[0]+=789;key[3]+=135;
}
}
//answer:dDc75e1fE98cBCe8
带入程序得最终flag
需要修改长度判断
flag{42dDc75e1fE98cBCe842}