-
-
[原创]看雪CTF 2019看雪CTF 晋级赛Q1 第一题 流浪者 writeup
-
2019-3-18 19:02 2323
-
拿到程序,PE文件,查壳
没有壳,C++编写,运行看结果
弹出对话框,输入密码,比较,进入IDA查看具体流程
搜索字符串
查看调用“KanXueCTF2019JustForhappy”的函数
经分析,变量int a1应该是一个数组首地址,在while循环中进行Str1[v4] = aAbcdefghiabcde[*(_DWORD *)(a1 + 4 * v4)]与字符串比较,相等则通过,继续查看函数sub_4017F0的调用情况
本函数中,直接将输入的字符串进行for循环检测并进行初步运算,即每个字符ASCII值只能在48-57、65-90、97-122之间,也就是大小写字母和数字0-9,之后进行简单的算术运算就进入sub_4017F0中进行查找运算比较,可直接穷举暴力破解
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char str1[] = "abcdefghiABCDEFGHIJKLMNjklmn0123456789opqrstuvwxyzOPQRSTUVWXYZ"; char str2[] = "KanXueCTF2019JustForhappy"; char chrarr[63]; for (int i = 0; i < 62; i++) { if (i < 10) { chrarr[i] = char(i + '0'); } else if (i < 36) { chrarr[i] = char(i + 'A' - 10); } else { chrarr[i] = char(i + 'a' - 36); } } chrarr[62] = '\0'; //生成元素集合 //printf("chrarr = %s\n", chrarr); for (int j = 0; j < strlen(str2); j++) { int a; for (int i = 0; i < 62; i++) { if (chrarr[i] <= '9' && chrarr[i] >= '0') { a = chrarr[i] - 48; if (str1[a] == str2[j]) { printf("%c", chrarr[i]); } } if (chrarr[i] <= 'z' && chrarr[i] >= 'a') { a = chrarr[i] - 87; if (str1[a] == str2[j]) { printf("%c", chrarr[i]); } } if (chrarr[i] <= 'Z' && chrarr[i] > 'A') { a = chrarr[i] - 29; if (str1[a] == str2[j]) { printf("%c", chrarr[i]); } } } } puts("\n"); system("pause"); return 0; }
即
j0rXI4bTeustBiIGHeCF70DDM,提交,正确
[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界
赞赏
他的文章
谁下载
看原图