首页
论坛
专栏
课程

[原创]又双叒叕是adws啊

2018-12-12 21:06 523

[原创]又双叒叕是adws啊

2018-12-12 21:06
523
程序没什么强保护,至少不用花太多时间在反调试和去扰,可以专心看算法了。
TLS回调标准用法,代码中使用了小部分的跳转代码自修改。
看了一下标准入口下的流程,如果按那条线路来理解肯定是没有解的,所以基本敲定TLS中的函数是关键,稍加留心就可定位到关键算法部分。
关键算法部分中出现 a d w s,又是个上下左右按键的题,和前面某次看雪比赛中的走迷宫题型类似,细看一下原来是3*3的数字华容道。
就是从源状态跑到目标状态
4 1 3       1 2 3
7 2 5  ->   4 5 6
8 6 0       7 8 0

好吧,懒得动手了,交给程序来跑。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

unsigned char g[12]={4,1,3,7,2,5,8,6,0};
unsigned char t[12][12];
unsigned char s[12]={1,2,3,4,5,6,7,8,0};
int z[12];
int p[12];

void PRN(int lev)
{
	int i;

	for(i=1; i<=lev; i++)
	{
		switch(z[i])
		{
		case 0: printf("d%d", p[i]); break;
		case 1: printf("a%d", p[i]); break;
		case 2: printf("w%d", p[i]); break;
		case 3: printf("s%d", p[i]); break;
		default: printf("error!"); break;
		}
	}
	printf("\n");
}

void sol(int lev, int fw, int x, int y)
{
	memcpy(t[lev], t[lev-1], 12); 
	switch(fw)
	{
	case 0:
		if (x>0)
		{
			p[lev] = t[lev][y*3+x] = t[lev][y*3+x-1];
			t[lev][y*3+x-1] = 0;
			z[lev] = 0;
			x = x-1;
		}
		else
		{
			return;
		}
		break;
	case 1:
		if (x<2)
		{
			p[lev] = t[lev][y*3+x] = t[lev][y*3+x+1];
			t[lev][y*3+x+1] = 0;
			z[lev] = 1;
			x = x+1;
		}
		else
		{
			return;
		}
		break;
	case 2:
		if (y<2)
		{
			p[lev] = t[lev][y*3+x] = t[lev][(y+1)*3+x];
			t[lev][(y+1)*3+x] = 0;
			z[lev] = 2;
			y = y+1;
		}
		else
		{
			return;
		}
		break;
	case 3:
		if (y>0)
		{
			p[lev] = t[lev][y*3+x] = t[lev][(y-1)*3+x];
			t[lev][(y-1)*3+x] = 0;
			z[lev] = 3;
			y = y-1;
		}
		else
		{
			return;
		}
		break;
	default:break;
	}
	if (memcmp(t[lev], s, 9) == 0) 
	{
		PRN(lev);
		return;
	}
	if (lev>9) return;
	
	sol(lev+1, 0, x, y);
	sol(lev+1, 1, x, y);
	sol(lev+1, 2, x, y);
	sol(lev+1, 3, x, y);
}

int main()
{
	memcpy(t[0], g, 12);
	sol(1, 0, 2, 2);
	sol(1, 1, 2, 2);
	sol(1, 2, 2, 2);
	sol(1, 3, 2, 2);
	return 0;
}
所有10以内的解如下:
d6d8a8d8s7s4a1w2a5w6
d6d8s7a2d2s4a1w2a5w6
d6d8s7w7s7s4a1w2a5w6
d6d8s7s4a1d1a1w2a5w6
d6d8s7s4a1a3d3w2a5w6
d6d8s7s4a1w2d4a4a5w6
d6d8s7s4a1w2a5d5a5w6
d6d8s7s4a1w2a5w6
d6d8s7s4a1w2a5s3w3w6
d6d8s7s4a1w2w8s8a5w6
d6d8s7s4a1w2s2w2a5w6
d6d8s7s4w4s4a1w2a5w6
d6a6d6d8s7s4a1w2a5w6
d6s2w2d8s7s4a1w2a5w6
s5w5d6d8s7s4a1w2a5w6
这只是第一重检验,第二重是个类CRC的hash,可以从上面的解中挑出唯一一个,考虑到结果多重可能性中的重复性,直接挑了个最短的试试,果然success。


[推荐]看雪企服平台,提供安全分析、定制项目开发、APP等级保护、渗透测试等安全服务!

上一主题 下一主题
最新回复 (0)
游客
登录 | 注册 方可回帖
返回