首页
论坛
专栏
课程

[原创]第六题:消失的岛屿

2019-6-24 11:59 592

[原创]第六题:消失的岛屿

2019-6-24 11:59
592

1.思路

变异的base64
看到base64 就不想逆,
因为输入与输出的基本成线性变化,3字节对应4字节
则可穷举,但是好像flag多了个下划线有点坑
不是说字母加数字吗?
// Kctf-q2-Crack6.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <stdio.h>
#include <windows.h>
BYTE temp[] = "!NGV%,$h1f4S3%2P(hkQ94==";
char Tab[65] = "tuvwxTUlmnopqrs7YZabcdefghij8yz0123456VWXkABCDEFGHIJKLMNOPQRS9+/";
int __cdecl charEncrypt(int a1)
{
	signed int v2; // [esp+18h] [ebp+8h]

	v2 = Tab[a1];
	if (v2 > 64 && v2 <= 90)
		return 155 - v2;
	if (v2 > 96 && v2 <= 122)
		return v2 - 64;
	if (v2 > 47 && v2 <= 57)
		return v2 + 50;
	if (v2 == 43)
		return 119;
	if (v2 == 47)
		v2 = 121;
	return v2;
}
int __cdecl base64_encode(int a1, int a2, int a3)
{
	int v3; // eax
	BYTE *v4; // ebx
	int v5; // eax
	int v6; // ST0C_4
	BYTE *v7; // ebx
	int v8; // eax
	int v9; // eax
	BYTE *v10; // ebx
	int v11; // eax
	int v12; // eax
	BYTE *v13; // ebx
	unsigned __int8 v15; // [esp+Bh] [ebp-Dh]
	unsigned __int8 v16; // [esp+Bh] [ebp-Dh]
	int v17; // [esp+Ch] [ebp-Ch]
	int v18; // [esp+Ch] [ebp-Ch]
	int v19; // [esp+Ch] [ebp-Ch]
	int v20; // [esp+10h] [ebp-8h]

	v20 = 0;
	v17 = 0;
	while (v20 < a3)
	{
		v3 = v17;
		v18 = v17 + 1;
		v4 = (BYTE *)(v3 + a2);
		*v4 = charEncrypt((*(BYTE *)(v20 + a1) >> 2) & 0x3F);
		v15 = 16 * *(BYTE *)(v20 + a1) & 0x30;
		if (v20 + 1 >= a3)
		{
			v5 = v18;
			v6 = v18 + 1;
			v7 = (BYTE *)(v5 + a2);
			*v7 = charEncrypt(v15);
			*(BYTE *)(v6 + a2) = 61;
			v8 = v6 + 1;
			v17 = v6 + 2;
			*(BYTE *)(v8 + a2) = 61;
			break;
		}
		v9 = v18;
		v19 = v18 + 1;
		v10 = (BYTE *)(v9 + a2);
		*v10 = charEncrypt((unsigned __int8)((*(BYTE *)(v20 + 1 + a1) >> 4) | v15));
		v16 = 4 * *(BYTE *)(v20 + 1 + a1) & 0x3C;
		if (v20 + 2 >= a3)
		{
			*(BYTE *)(v19 + a2) = charEncrypt(v16);
			v11 = v19 + 1;
			v17 = v19 + 2;
			*(BYTE *)(v11 + a2) = 61;
			break;
		}
		*(BYTE *)(v19 + a2) = charEncrypt((unsigned __int8)((*(BYTE *)(v20 + 2 + a1) >> 6) | v16));
		v12 = v19 + 1;
		v17 = v19 + 2;
		v13 = (BYTE *)(v12 + a2);
		*v13 = charEncrypt(*(BYTE *)(v20 + 2 + a1) & 0x3F);
		v20 += 3;
	}
	*(BYTE *)(v17 + a2) = 0;
	return v17;
}
char ascii[66] = "tuvwxTUlmnopqrs7YZabcdefghij8yz0123456VWXkABCDEFGHIJKLMNOPQRS9+/_";
//char ascii[63] = {0};
int n = 66;
unsigned char temp_result[24] = { 0 };
void find(char *f, int curr) {
	int len = strlen(f);
	for (int i = 0; i < n; i++) {
		char c1 = ascii[i];
		memcpy(f + len, &c1, 1);
		for (int j = 0; j < n; j++) {
			char c2 = ascii[j];
			memcpy(f + len + 1, &c2, 1);
			for (int m = 0; m < n; m++) {
				char c3 = ascii[m];
				memcpy(f + len + 2, &c3, 1);
				//eq(f);
				base64_encode((int)f, (int)temp_result, strlen(f));
				if (temp_result[curr] == temp[curr]) {
					if (temp_result[curr + 1] == temp[curr + 1]) {
						if (temp_result[curr + 2] == temp[curr + 2]) {
							if (temp_result[curr + 3] == temp[curr + 3]) {
								memcpy(f + len, &c1, 1);
								memcpy(f + len + 1, &c2, 1);
								memcpy(f + len + 2, &c3, 1);
								return;
							}
						}
					}
				}
			}
		}
	}
	printf("no");
}
int main()
{
    //std::cout << "Hello World!\n"; 
	/*
	char s[256] = "2111111111111111";
	char *s1 = (char *)malloc(256 * sizeof(char));
	base64_encode((int)s, (int)s1, 16);
	printf(s1);
	*/
	char s[256] = "KanXue2019ctf";
	int l = strlen(s);
	for (int i = 0; i < 255;i++) {
		for (int j = 0; j < 255;j++) {
			char t1 = (char)i;
			char t2 = (char)j;
			memcpy(s + l, &t1, 1);
			memcpy(s + l + 1, &t2, 1);
			base64_encode((int)s, (int)temp_result, strlen(s));
			int curr = 16;
			if (temp_result[curr] == temp[curr]) {
				if (temp_result[curr + 1] == temp[curr + 1]) {
					if (temp_result[curr + 2] == temp[curr + 2]) {
						if (temp_result[curr + 3] == temp[curr + 3]) {
							break;
						}
					}
				}
			}
			memset(temp_result, 0, 24);
		}
	}




	char f[24] = { 0 };
	int n = 63;
	//123 456 789 012 345 6
	for (int i = 0; i < 5; i++) {
		find(f, i * 4);
	}
	int len = strlen(f);
	for (int i = 0; i < n; i++) {
		char c = ascii[i];
		memcpy(f + len, &c, 1);
		base64_encode((int)f, (int)temp_result, 16);
		if (temp_result[19] == temp[19] && temp_result[20] == temp[20] && temp_result[21] == temp[21] && temp_result[22] == temp[22]) {
			memcpy(f + len, &c, 1);
			break;
		}
	}
	printf("Found one password :%s\n", f);
}



[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

最新回复 (0)
游客
登录 | 注册 方可回帖
返回