PEID查壳
发现是UPX的壳,脱壳
脱壳之后再查壳
关键代码审计
进入main函数
再进入到main_0函数
代码分析
打印
并将输入的字符串保存在Source变量里面
具体分析如图所示
sub_411190()函数将Source的值与"TOiZiZtOrYaToUwPnToBsOaOapsyS"对比
按x查看交叉引用
来到StartAddress_0()函数里面
dword_418008的值为29
查看WaitForSingleObject函数的交叉引用
其实可以知道,当执行量为10时,转向被冻结线程B,也就是说sub_41119F,dword_418008=29当执行到第9执行量的时候减一,然后线程被冻结(Sleep),然后转向另一个线程,结合图我们可以知道,当数值为奇数的时候,对字符串进行处理,为偶数的时候不进行处理,其实就叫线程互斥,每两个字符写一次
进入sub_41112C()函数
跳转问题
将jz改为jmp就可了
就可以F5了
分析清楚可以写脚本了
脚本
#include<stdio.h>
int main(void)
{
char str1[] = "TOiZiZtOrYaToUwPnToBsOaOapsyS";
char str2[] = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm";
char flag[30] = {0};
int i = 0;
int j = 0;
for(i = 28;i > -1;i--)
{
if(i % 2 == 1){ //为奇数时
for(j = 0;j < 52;j++) //52是因为str2的长度为53 也可以改为sizeof(str2)-1
{
if(str1[i] == str2[j])
{
flag[i] = j+ 38;
if(!(flag[i] >= 65 && flag[i] <= 90))
{
flag[i] = j+96;
break;
}
}
}
}else
{
flag[i] = str1[i];
continue;
}
}
puts(flag);
return 0;
}
get flag
查看大佬的wpBUUCTF-re-Youngter-drive
其实最后一位没有对比,所以要多加一个E,搞得我忙活半天,还以为出错了
flag{ThisisthreadofwindowshahaIsESE}