buuctf--->Youngter-drive

发布于:2024-10-10 ⋅ 阅读:(17) ⋅ 点赞:(0)

做题笔记

下载 查壳。

脱壳之后:

32ida打开。

因为这题运行不起来,调试不起来,会报错,只能纯分析。

所以,我先看的字符串:>>>信息收集。

看见的一瞬间就知道,是某种表以及某种加密。

进行跟踪。

在跟踪长的。

a2+a1 这一看就是其中某一个是数组,所以具体跟进传入进行分析就好

跟踪sub_411940就好。

然后会来到这个界面,继续分析。

”Source“很眼熟,在字符判断时也出现过,猜测是input。

综上,其实 Source 也就是input长度为29。

继续分析:

跟踪 StartAddress_0 函数 看看哪儿进行引用了。

最终会来到这个界面。

CreateThread是创建线程的API   

CloseHandle没记错 好像是关闭句柄的API

CreateMutexW不知道 查呗:

可以得出:

starAddress内容就是我们此前跟踪的。

sub_41119F内容如下:

所以,此时可以综合所有已知的。

重点在于——CreateMutexW这个互斥函数。

相当于,这两种算法只能在同一时间实现一个。

脚本:不会,不想动脑筋(思路清晰,不想写。。。看具体分析就好。)

参考:

Youngter-drive - PYozo_free - 博客园 (cnblogs.com)icon-default.png?t=O83Ahttps://www.cnblogs.com/pppyyyzzz/p/12468370.html#:~:text=Youngt

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
	char encode[50] = "TOiZiZtOrYaToUwPnToBsOaOapsyS";
	char table[100] = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm";
	char flag[50] = " ";
	
	//算法逆向。
	for (int i = 0; i < strlen(encode); i++)
	{
		flag[i] = encode[i];

		i++;//考虑互斥关系。

		int j = 0;
		while (encode[i]!=table[j])
		{
			j++;
		}//get到这种写法,等价于python table.find(encode[index]) ---在表中查找对应字符。

		//查找之后 根据大小写处理方式不同逆向写脚本。
		if (encode[i]>='A'&&encode[i]<='Z')
		{
			flag[i]= j + 96;
		}
		else//‘a’~'z'
		{
			flag[i]= j + 38;
		}
		//说明:这样写,是因为 flag就是table中的index 实际上可以转换成 index 与index之间的关系。
	}
	printf("%s", flag);
	printf("\n");
	system("pause");
	return 0;
}

flag{ThisisthreadofwindowshahaIsESE}

题外话:

这题算法还好,能理解。

关键是 提高对win32 API的重视程度,如果 不知道 createMutexW互斥 那想都别想做。。。。