首页
社区
课程
招聘
[原创]CTF2019晋级赛Q2第六题分析(qwertyaa)
2019-6-13 05:42 2430

[原创]CTF2019晋级赛Q2第六题分析(qwertyaa)

2019-6-13 05:42
2430

可以看到这个程序主要是 BASE64 的变体,它里面的 charEncrypt 如下

char from[]="tuvwxTUlmnopqrs7YZabcdefghij8yz0123456VWXkABCDEFGHIJKLMNOPQRS9+/";
char charEncrypt(char data)
{
  char dataa;
  dataa = from[data];
  if ( dataa > '@' && dataa <= 'Z' )
    return -101 - dataa;
  if ( dataa > '`' && dataa <= 'z' )
    return dataa - 64;
  if ( dataa > '/' && dataa <= '9' )
    return dataa + 50;
  if ( dataa == '+' )
    return 'w';
  if ( dataa == '/' )
    dataa = 'y';
  return dataa;
}

而普通的 BASE64 的 charEncrypt 如下:

char reb[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
char charEncrypt(char data)
{
  char dataa;
  dataa = reb[data];
  return dataa;
}

两个 charEncrypt 都是置换,对每个字符求第一个置换的逆置换后进行第二个置换的结果即可,代码如下:

#include <bits/stdc++.h>
using namespace std;
char reb[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
char from[]="tuvwxTUlmnopqrs7YZabcdefghij8yz0123456VWXkABCDEFGHIJKLMNOPQRS9+/";
char result[]="!NGV%,$h1f4S3%2P(hkQ94==";
char charEncrypt(char data)
{
  char dataa;
  dataa = from[data];
  if ( dataa > '@' && dataa <= 'Z' )
    return -101 - dataa;
  if ( dataa > '`' && dataa <= 'z' )
    return dataa - 64;
  if ( dataa > '/' && dataa <= '9' )
    return dataa + 50;
  if ( dataa == '+' )
    return 'w';
  if ( dataa == '/' )
    dataa = 'y';
  return dataa;
}
char re[256];
int main(){
    for(int i=0;i<strlen(reb);i++){
        re[charEncrypt(i)]=i;
    }
    int len=strlen(result);
    for(int i=0;i<len;i++)if(result[i]!='='){
        result[i]=reb[re[result[i]]];
    }
    puts(result);
}

将结果用 javascript 的 atob 函数解码得FLAG: KanXue2019ctf_st


[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回