-
-
[原创]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虚拟机自动化脱壳的方法
赞赏
他的文章
看原图