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

无壳,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);
    
   
  }

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值