0
点赞
收藏
分享

微信扫一扫

wust-ctf2021校赛-re-findit 一道smc题

陆佃 2022-03-27 阅读 25
c语言

无壳,32位

进去直接f5看main函数

我们注意到

这个把ssd的地址给了we

 地址存储的数据被异或了

 

 写ida的idc进行异或

 ida的idcpy可以写

我这里用的是idc

 我们要找函数尾巴

pop ebx,pop esi,pop ebp  retn 这些标志函数结尾

直接限定给出定义函数到这个函数尾,有些看不懂的数据直接,按c强行转换成汇编指令

全部转换后可以回到ssd,这个时候可以看f5看伪代码

 函数加载出来了

 

#include<string.h>
#include<stdio.h>
int main()
  {
  char enflag[20];
  char Str[20];
  char v4[]= "REVERSE";
     enflag[0] = 81;
     enflag[1] = -72;
     enflag[2] = 90;
     enflag[3] = 18;
     enflag[4] = 16;
     enflag[5] = -6;
     enflag[6] = 13;
     enflag[7] = 35;
     enflag[8] = 1;
     enflag[9] = 23;
     enflag[10] = 8;
     enflag[11] = 9;
     enflag[12] = 27;
     enflag[13] = 0;
     enflag[14] = 18;
     enflag[15] = 44;
     enflag[16] = -14;
     enflag[17] = 18;
     enflag[18] = 17;
     enflag[19] = 14;
   int v1; int v2;
    int len = 20; 
    //v4被运算了要先处理,然后步骤都逆向就行
     for (int  k = 0; ; ++k )
    { 
      v1 = k;
      if ( v1 >=strlen(v4) )
        break;
      v4[k] %= 64;
    }
     for (int  n = 0; n < 20; ++n )
    {
       
      if ( (v4[n % 7] & 1) != 0 )
        v2 = enflag[n] - 2;
      else
        v2 = enflag[n] -1;
      
     enflag[n] = v2;
    }
      for ( int m = 0; len / 2 > m; ++m )
    { int v5;
      v5 =enflag[len - m - 1] ;
      enflag[len - m - 1] = enflag[m];
      enflag[m] = v5;
    }
    for ( int l = 0; l < len; ++l )
     enflag[l] -= v4[l % 7];
    
    
    for ( int j = 18; j >=0; --j )
      enflag[j] += enflag[j + 1];
       
    for ( int i = 0; i < len; ++i )
       enflag[i] += 64;
       
     enflag[len]='\0';
    puts(enflag);
    
   
  }
举报

相关推荐

0 条评论