BUUCTF Reverse/Youngter-drive

BUUCTF Reverse/Youngter-drive

BUUCTF Reverse/Youngter-drive_第1张图片

查壳发现UPX壳,且为·32位程序

BUUCTF Reverse/Youngter-drive_第2张图片

用脱壳工具脱壳

BUUCTF Reverse/Youngter-drive_第3张图片

用IDA32位打开

BUUCTF Reverse/Youngter-drive_第4张图片

跟进查看,又是一道字符串比较的题目

BUUCTF Reverse/Youngter-drive_第5张图片

BUUCTF Reverse/Youngter-drive_第6张图片

发现这个函数对输入的字符串进行了比较

BUUCTF Reverse/Youngter-drive_第7张图片

int sub_411880()
{
  int i; // [esp+D0h] [ebp-8h]

  for ( i = 0; i < 29; ++i )
  {
    if ( *(&Source + i) != off_418004[i] )
      exit(0);
  }
  return printf("\nflag{%s}\n\n", Destination);
}

在这里插入图片描述

返回主函数查看,发现这个函数对输入的字符串进行了变换

BUUCTF Reverse/Youngter-drive_第8张图片
BUUCTF Reverse/Youngter-drive_第9张图片
BUUCTF Reverse/Youngter-drive_第10张图片

写出脚本

#include 
#include 
#include 
int main()
{

   char flag[] = "TOiZiZtOrYaToUwPnToBsOaOapsyS";
   char t[] = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm";

   for(int i = 0 ; i < 29; i ++)
   {
       for(int j = 0 ; j < strlen(t); j++)
       {
            if(t[j] == flag[i] )
             {

                        if(j < 26)
                        {
                            printf("%c",j + 96);
                        }
                        else
                        {
                            printf("%c",j + 38);
                        }


                      break;
            }


       }
   }
   return 0;

}

运行,发现flag不正确

BUUCTF Reverse/Youngter-drive_第11张图片

返回发现原来有两个线程

BUUCTF Reverse/Youngter-drive_第12张图片

一个线程对字符串进行变换,同时将数组下标减1,另一个线程仅将数组下标减1,不做任何变换.

BUUCTF Reverse/Youngter-drive_第13张图片

BUUCTF Reverse/Youngter-drive_第14张图片

这两个线程是交替进行的,相当于每进行一次操作,数组下标就减去2,而这个是从下标为29开始的,相当于只对奇数位进行变换,偶数位不变

改动一下脚本

#include 
#include 
#include 
int main()
{
   
   char flag[] = "TOiZiZtOrYaToUwPnToBsOaOapsyS";
   char t[] = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm";

   for(int i = 0 ; i < 29; i ++)
   {
       for(int j = 0 ; j < strlen(t); j++)
       {
            if(t[j] == flag[i] )
             {
                  if( i % 2 != 0)
                    {
                        if(j < 26)
                        {
                            printf("%c",j + 96);
                        }
                        else
                        {
                            printf("%c",j + 38);
                        }

                    }
                    else
                    {
                        printf("%c",flag[i]);
                    }
                      break;
            }


       }
   }
   return 0;

}

运行得到结果

BUUCTF Reverse/Youngter-drive_第15张图片

但是这是从下标为29开始的,说明flag有30位,而输出的结果只有29位,看了大佬的wp知道最后一位为E

flag : flag{ThisisthreadofwindowshahaIsESE}

你可能感兴趣的:(#,BUUCTF,Reverse)