首页
社区
课程
招聘
[原创]看雪CTF 2019看雪CTF 晋级赛Q1 第一题 流浪者 writeup
2019-3-18 19:02 2323

[原创]看雪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世界

上传的附件:
收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回