[BUUCTF]REVERSE——刮开有奖
阅读原文时间:2023年07月09日阅读:5

刮开有奖

附件

步骤:

  1. 例行检查,无壳,32位程序

  2. 32位ida载入,shift+f12检索程序里的字符串,看到了一个base64加密的特征字符串,猜想这题用到了base64加密

  3. 从main函数开始看程序

    DialogBoxParam函数百度后得知是根据对话框模板资源创建一个模态的对话框,直接看函数主体

    if ( a2 == 272 )
    return 1;
    if ( a2 != 273 )
    return 0;
    if ( (WORD)a3 == 1001 ) // a3=1001 { memset(&String, 0, 0xFFFFu); // memset函数将string初始化置0 GetDlgItemTextA(hDlg, 1000, &String, 0xFFFF); if ( strlen(&String) == 8 ) // string的长度为8 { v7 = 90; v8 = 74; v9 = 83; v10 = 69; v11 = 67; v12 = 97; v13 = 78; v14 = 72; v15 = 51; v16 = 110; v17 = 103; sub_4010F0((int)&v7, 0, 10); // sub_4010F0是一个排序 升序的算法 , // 对v7数组进行处理后,v7的数据是 // 51 67 69 72 74 78 83 90 97 103 110 // memset(&v26, 0, 0xFFFFu); v26 = string[5]; v28 = string[7]; v27 = string[6]; v4 = sub_401000((int)&v26, strlen(&v26)); // sub_401000是base64加密算法,对v26进行了base64加密后复制给v4 memset(&v26, 0, 0xFFFFu); // v26清0 v27 = string[3]; v26 = string[2]; v28 = string[4]; v5 = sub_401000((int)&v26, strlen(&v26)); if ( String == v7 + 34 // string[0]='U' && string[1] == v11 // string[1]='J' && 4 * string[2] - 141 == 3 * v9 // string[2]='W' && string[3] / 4 == 2 * (v14 / 9) // string[3]='P' && !strcmp(v4, "ak1w") // V4=ak1w && !strcmp( v5, "V1Ax") ) { // v5=V1Ax MessageBoxA(hDlg, "U g3t 1T!", "@@", 0);
    }
    }
    return 0;
    }
    if ( (_WORD)a3 != 1 && (_WORD)a3 != 2 )
    return 0;
    EndDialog(hDlg, (unsigned __int16)a3);
    return 1;
    }

代码的大部分分析都写在注释里了,剩下的就是两个base64解密,用python3自带的base64库解密一下

根据这段代码,将string字符串理一下得到flag

flag{UJWP1jMp}

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章