做题笔记
下载 查壳。
脱壳之后:
32ida打开。
因为这题运行不起来,调试不起来,会报错,只能纯分析。
所以,我先看的字符串:>>>信息收集。
看见的一瞬间就知道,是某种表以及某种加密。
进行跟踪。
在跟踪长的。
a2+a1 这一看就是其中某一个是数组,所以具体跟进传入进行分析就好
跟踪sub_411940就好。
然后会来到这个界面,继续分析。
”Source“很眼熟,在字符判断时也出现过,猜测是input。
综上,其实 Source 也就是input长度为29。
继续分析:
跟踪 StartAddress_0 函数 看看哪儿进行引用了。
最终会来到这个界面。
CreateThread是创建线程的API
CloseHandle没记错 好像是关闭句柄的API
CreateMutexW不知道 查呗:
可以得出:
starAddress内容就是我们此前跟踪的。
sub_41119F内容如下:
所以,此时可以综合所有已知的。
重点在于——CreateMutexW这个互斥函数。
相当于,这两种算法只能在同一时间实现一个。
脚本:不会,不想动脑筋(思路清晰,不想写。。。看具体分析就好。)
参考:
#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互斥 那想都别想做。。。。