首页
论坛
专栏
课程

[原创]第二题 消失的岛屿 wp

2019-6-24 12:27 968

[原创]第二题 消失的岛屿 wp

2019-6-24 12:27
968

丢进ida里就能看到程序的逻辑,对输入进行base64编码,之后验证。

不过是魔改的base64,只是修改了字符顺序,中间还有一个字符串映射,重写一下base64 decode就解决了。


#include <cstdio>
#include <cstring>
#include <cstdlib>

using namespace std;

char save[] = "tuvwxTUlmnopqrs7YZabcdefghij8yz0123456VWXkABCDEFGHIJKLMNOPQRS9+/";

char get_idx(char c){
    for(int i=0; i<strlen(save); i++){
        if(c == save[i]) return i;
    }
    return -1;
}

int charDecrypt(char c){
    if(c == '=') return 0;
    if(c == 'y') return get_idx('/');
    if(c == 'w') return get_idx('+');
    if(c-'2' > '/' && c-'2' <= '9') return get_idx(c - '2');
    if(c+'@' > '`' && c+'@' <= 'z') return get_idx(c + '@');
    if(-c+155 > '@' && -c+155 <= 'Z') return get_idx(-c + 155);
}
/*
8 8 8
6 6 6 6
6 2
4 4
2 6
*/
char* base64Decode(char *s){
    int len = strlen(s);
    char *res = (char *)malloc(len / 4 * 3);
    int cnt = 0;

    for(int i=0; i<len; i+=4){
        int a1 = charDecrypt(s[i]);
        int a2 = charDecrypt(s[i+1]);
        int a3 = charDecrypt(s[i+2]);
        int a4 = charDecrypt(s[i+3]);
        printf("%x %x %x %x\n", a1, a2, a3, a4);

        res[cnt++] = ((a1&0x3f)<<2) | (a2>>4);
        res[cnt++] = ((a2&0x0f)<<4) | (a3>>2);
        res[cnt++] = ((a3&0x03)<<6) | (a4&0x3f);
    }

    return res;
}

int main(){
    printf("flag:%s\n", base64Decode("!NGV%,$h1f4S3%2P(hkQ94=="));
}



[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

最新回复 (0)
游客
登录 | 注册 方可回帖
返回