[FlareOn3]Challenge1 1
关键代码
查看sub_401260加密逻辑
魔改base64加密
在线解密:在线自定义base64编解码、在线二进制转可打印字符、在线base2、base4、base8、base16、base32、base64--查错网 (chacuo.net)
flag{sh00ting_phish_in_a_barrel@flare-on.com}
[羊城杯 2020]easyre 1
发现flag(input)经过三次加密后的结果与str2作比较,得知加密后结果即是str2对应的字符串
查看encode_one
发现是标准的base64加密
查看encode_two
将加密后的数据位置打乱
查看encode_three
凯撒加密
开始对加密后的密文进行逆向
首先进行凯赛解密:在线凯撒密码加密解密 (lddgo.net)
需要注意的是这里偏移量为3,并且对数字没有解密还需要把解密后字符串中的数据减去3
然后进行第二个解密,
解密逻辑:每13个一组进行顺序变化
变换后的顺序:
R1dIVHs2NzJjYzQ3NzhhMzhlODBjYjM2Mjk4NzM0MTEzM2VhMn0=
然后在经过base64解码即可:
、
flag{672cc4778a38e80cb362987341133ea2}
[ACTF新生赛2020]Oruga 1
拿到附件查看源代码,发现只有一个函数有用
跟进查看
在跟进
看其他大佬的wp知道是一个迷宫题目
那么下面这块就应该是控制上下左右方向的
经过猜测W应为上 M为下 E为右 J为左
依据(符号代表越界)
然后我们观察两个循环条件,第一个大循环意思就是这个值不能等于 33,若等于 33循环结束
第二个循环是 这个值不能为 0
第二个循环还可以看出,若遇不到0 v2就一直朝某方向加加
由此可得:我们知道起始位置(0,0)以及结束条 !=33 以及改变方向条件 遇到0时
逆向求解:
提取数据:
:
我们容易知道该迷宫是16X16
写一个简单脚本
int main() {
char arr[][16] = {0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x23, 0x23, 0x23, 0x23, 0x00, 0x00, 0x00, 0x23,
0x23, 0x00, 0x00, 0x00, 0x4F, 0x4F, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x4F, 0x4F, 0x00, 0x50, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x4C, 0x00, 0x4F, 0x4F, 0x00, 0x4F, 0x4F, 0x00, 0x50,
0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x4F,
0x4F, 0x00, 0x4F, 0x4F, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x4C, 0x4C, 0x00, 0x4F, 0x4F, 0x00, 0x00, 0x00,
0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x4F, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00,
0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x4D, 0x4D, 0x4D, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x4D, 0x4D,
0x00, 0x00, 0x00, 0x00, 0x45, 0x45, 0x00, 0x00, 0x00, 0x30,
0x00, 0x4D, 0x00, 0x4D, 0x00, 0x4D, 0x00, 0x00, 0x00, 0x00,
0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x45, 0x54, 0x54,
0x54, 0x49, 0x00, 0x4D, 0x00, 0x4D, 0x00, 0x4D, 0x00, 0x00,
0x00, 0x00, 0x45, 0x00, 0x00, 0x54, 0x00, 0x49, 0x00, 0x4D,
0x00, 0x4D, 0x00, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
0x00, 0x54, 0x00, 0x49, 0x00, 0x4D, 0x00, 0x4D, 0x00, 0x4D,
0x21, 0x00, 0x00, 0x00, 0x45, 0x45 };
for (int i = 0; i < 16; i++) {
for (int j = 0; j < 16; j++) {
if (arr[i][j] == 0) {
printf(" * ");
}
else if(arr[i][j]==33){
printf(" $ ");
}
else {
printf(" 0 ");
}
}
printf("\n");
}
return 0;
}
运行结果
即可进行求解
flag{MEWEMEWJMEWJM}
[Zer0pts2020]easy strcmp 1
(本题不会,看的大佬的wp,写出来仅供复习)
打开该附件找到main函数,发现直接有个比较,但直接交flag是不对的
然后观察其他函数功能
在这个函数我们可以看到strcmp的地址赋值给qword_562160A01090
查看如上函数,可以明该函数也是strcmp地址
接下来继续查看函数sub_5621608006EA函数
发现这个函数进行了一次加密,并调用qword_562160A01090 我们知道这个函数刚才已经被赋值strcmp地址,由此可知main函数比就是该地方的比较,input相当于加密后的flag a2相当于字符·串zer0pts{********CENSORED********}
解密脚本:
int main()
{
char p[] = "zer0pts{********CENSORED********}";
uint64 k[4] = { 0, 0x410A4335494A0942, 0x0B0EF2F50BE619F0, 0x4F0A3A064A35282B };
for (int i = 0; i < 4; i++)
{
*(uint64*)&(p[i*8]) += k[i];
}
cout << p;
}
flag{l3ts_m4k3_4_DETOUR_t0d4y}