#include
#include
#include
#include
int main()
{
int a[28]={0xF1, 0xE8, 0x81, 0xC8,0xD2, 0x81, 0xCF, 0xCE
,0xD5, 0x81, 0xC0, 0x81, 0xD3, 0xC0, 0xD5, 0xC8,
0xCE, 0xCF, 0xC0, 0xCD,0x81, 0xCF, 0xD4, 0xCC,
0xC3, 0xC4, 0xD3, 0x8F};
int i;
printf("FLAG{");
for(i=0;i<28;i++)
{
a[i]^=0x12B9B0A1;
printf("%c",a[i]);
}
printf("}");
return 0;
}
这个。。。凯撒密码,可以写逆运算,当然直接百度在线解密一下也行
CTF在线工具
反编译后用ue打开
代码很复杂。。。再加上我py不咋地,看着有点懵逼,但仔细看看,只要吧验证的那段全都删掉就可以了
然后百度在线py,跑一下就行了。
拖进ida
首先可以看出v3就是flag的长度
中间有SHA512加密(不懂但是可以继续往下看)
发现其实关键代码在4008C0那
点进去
通过调试其实可以发现6013C0和6013B0都是从0开始
那么逻辑就很明显了,再结合一下题目标题的提示。
其实601080里各项放的就是flag与前面各项的和
减一下就能出flag了
上代码
#include
#include
#include
#include
int main()
{
int a[]={
195,
255,
493,
584,
799,
929,
946,
1086,
1180,
1184,
1421,
1595,
1805,
1846,
2081,
2320,
2430,
2605,
2727,
2972,
3213,
3403,
3418,
3649,
3712,
3950,
3989,
4193,
4228,
4394,
4523,
4624,
4706,
4935,
4999,
5072,
5106,
5291,
5510,
5536,
5644,
5751,
5993,
6118,
6126,
6198,
6211,
6410,
6469,
6609,
6647,
6752,
6978,
7010,
7053,
7106,
7274,
7468,
7563,
7673,
7706,
7956,
8146,
8187,
8257,
8333,
8398,
8469,
8592,
8640,
8693,
8742,
8793,
8844,
8901,
8953,
9007,
9062,
9113,
9161,
9215,
9317,
9374,
9429,
9483,
9540,
9591,
9644,
9692,
9741,
9792,
9846,
9944,
9996,
10045,
10144,
10195,
10246,
10294,
10350,
10402,
10450,
10551,
10652,
10750,
10849,
10946,
11045,
11096,
11147,
11202,
11304,
11353,
11451,
11507,
11605,
11653,
11753,
11852,
11900,
11951,
12052,
12105,
12161,
12259,
12360,
12409,
12461,
12563,
12664,
12718,
12775,
12823,
12921,
12970,
13020,
13071,
13173,
13227,
13276,
13374,
13422,
13521,
13569,
13667,
13718,
13771,
13873,
13972,
14029,
14080,
14179,
14278,
14377,
14432,
14482,
14531,
14579,
14627,
14679,
14732,
14789,
14840,
14894,
14951,
15052,
15154,
15210,
15263,
15314,
15363,
15460,
15509,
15610,
15666,
15763,
15818,
15916,
15968,
16018,
16075,
16132,
16233,
16288,
16386,
16443,
16543,
16600,
16655,
16703,
16801,
16858,
16955,
17005,
17056,
17153,
17250,
17375
};
int b=sizeof(a)/sizeof(int);
int i;
for(i=b-1;i>0;i--)
{
a[i]-=a[i-1];
}
for(i=64;i
运行一下就能看到里面的flag
#include
#include
#include
#include
int main()
{
unsigned char a[32]={0xa4, 0x19, 4, 130, 0x7e, 0x9e, 0x5b,
0xc7, 0xad, 0xfc,0xef, 0x8f, 150, 0xfb, 0x7e, 0x27,
0x68, 0x68, 0x92, 0xd0, 0xf9, 9, 0xdb, 0xd0, 0x65,
0xb6, 0x3e, 0x5c, 6, 0x1b, 5, 0x2e};
unsigned char b[32]={0};
unsigned int num,num3,index=0,i;
for(i=2147483648;;i++)
{
num=i;
num3=0;
index=0;
while(num!=0)
{
b[index]=a[index]^(num&0xFF)^num3;
num3^=a[index];
index++;
num>>=1;
}
if(!strncmp("FLAG{DO YOU KNOW GRAY",b,21))
{
printf("%s\n",b);
}
}
return 0;
}
一开始用strncmp是比较FLAG{然后跑出来第一个结果就是FLAG{DO YOU KNOW加上一堆乱码,然后逐步比较定下前面21个数。
不出一会跑出答案。
下面五题明天再说写wp
//最后俩题mov 和a maze 已经超出我的。。。能力范围了。。。
//还是太菜了
//2333