buuctf--->Youngter-drive
做题笔记
下载 查壳。
脱壳之后:
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)https://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互斥 那想都别想做。。。。