先查一下壳,是upx壳
脱一下壳
拖到ida,F5反汇编,分析一下
进入sub_411190()函数,分析一下,
可以找到off_418004的存内容
按x看一下flag的交叉引用
发现这是一个双线程的,进入sub_41112c看一下
对flag有一个变化
进入另一个线程看一下
另一个线程啥也没干,只有dw自减1,根据两个线程我们直到第奇数个字符不变,第偶数个字符进行第一个线程的操作
写代码
#include <stdio.h>
int main(void)
{
char off1[] = "TOiZiZtOrYaToUwPnToBsOaOapsyS";
char off2[] = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm";
char flag[30]={0};
int i,j;
for(i=28;i>-1;i--)
{
if(i%2==0)
{
flag[i] = off1[i];
continue;
}
for(j=0;j<52;j++)
{
if(off1[i] == off2[j])
{
flag[i] = j+38;
if(!(flag[i]>=65 &&flag[i]<=90))
flag[i] = j+96;
break;
}
}
}
puts(flag);
return 0;
}
虽然得出flag,但是把flag输入题目中是错误的,检查一下发现flag是有30位的,最后一位没进行比较,我们要得到最后一位,唯一的办法就是把字母一个一个代到答案中试一下,发现最后一个字符是E