平台WP · 2022年10月16日

2022ISCC-re五连

Amy's Code

放入ida中查看,主函数如下
在这里插入图片描述

很显然,重点函数是sub_411433和sub_4115FF
先从验证函数开始分析,也就是sub_411433
在这里插入图片描述

里面是一排数据和一个字符串,重点在这个循环
在这里插入图片描述

很显然,v4的值就是内一排数据,由v6+str得到,str就是我们输入的flag经过sub_4115FF得到,接下来看sub_4115FF
在这里插入图片描述

逻辑非常简单,就一个异或,好,开始写脚本
在这里插入图片描述

运行后得到flag
在这里插入图片描述

How_decode

Ida打开
在这里插入图片描述

发现一排数据,下面的功能主要由encode函数实现,点进去看看
在这里插入图片描述

发现是个xxtea加密,但有一些变动,sum的处理变成了减,所以解密脚本也要有对应的变化

#include <stdio.h>
#include <stdlib.h>
#define DELTA 1640531527 //0x61C88647//0x9e3779b9
#define MX  ((y ^ sum) + (z ^ key[e ^ p & 3])) ^ (((4 * y) ^ (z >> 5)) + ((y >> 3) ^ (16 * z)))
int main()
{
    signed int v[] = {
    -685738603,1455085884,-1790959305,-1803723433,
    2048519359,-570374864,-1444019902,1565487515,-1608389593,
    -2448347,-264877247,-1225587955,1807886879,1211382368,
    -1994197741,-640361855,359063046,596576564};
    unsigned int key[] = {73,83,67,67};
    signed int sum = 0;
    signed int y,z,p,rounds,e;
    int n = 18;  
    int i = 0;
    rounds = 6 + 52/n;
    y = v[0];
    sum = (rounds*(-DELTA));//这里DELTA取负值
        do                 
     {
        e = sum >> 2 & 3;
        for(p=n-1;p>0;p--)    
        {
            z = v[p-1];
            //v[p] = (v[p] - MX) ;
            y = v[p] -=MX;
        }
        z = v[n-1];
        //v[0] = (v[0] - MX) ;
        y = v[0] -=MX;
        sum += DELTA;//这里改为+=
     }while(--rounds);
    for(i=0;i<n;i++)
    {
        printf("%c",v[i]);
    }
    return 0;
}

运行后得到flag

在这里插入图片描述

GetTheTable

纯纯签到
发现Base58
在这里插入图片描述

直接base58解密密文得到flag
在这里插入图片描述

Bob's Code

进入主函数分析,4个重点关注函数,倒着逐个分析
在这里插入图片描述

sub_4116E0
在这里插入图片描述

很显然,这个是rot2加密,没啥好说的,下一个
sub_412D10
在这里插入图片描述

这个函数作用就是把a3加入字符串的a4位置,写还原脚本的时候给这个位置的字符去掉就行,继续下一个
sub_4127C0
在这里插入图片描述

这里是Base64加密,但需要注意他稍微做了一些变动,将”=”替换成了”.”并且还对码表做了些处理
在这里插入图片描述

写脚本的时候也需要使用处理过的码表,好的这个函数结束,继续下一个
sub_4116C7
在这里插入图片描述

标准的base64,没啥好说的,开写脚本
第一部分,解密rot2和去除加入的两个字符

#include<iostream>
#include<string>
using namespace std;
int main()
{
    int a2 = 2;
    string Str = ".W1BqthGbfhJWdG5BBGW1u.iXVojNqXbGyX1tEu1p5oZpqtMRbVYzyV1fkoF0.";
    for(int i = 0; i < Str.length();i++)
    {
        if ( Str[i] >= 97 && Str[i] <= 122 )
        {
            if(Str[i] - a2 < 97)
                Str[i] = Str[i] +26 -a2;
            else{
                Str[i] = Str[i] -a2;
            }
        }   
        else if(Str[i] >= 65 && Str[i] <=90)
        {
            if(Str[i] - a2 < 65)
                Str[i] = Str[i] +26 -a2;
            else{
                Str[i] = Str[i] -a2;
            }
        }
    }
    cout << Str << endl;
    string Str2 = "";
    for(int i = 1; i <22;i++)
    {
        Str2 += Str[i];
    }
    for(int i = 23; i < Str.length();i++)
    {
        Str2 += Str[i];
    }
    cout << Str2 << endl;
 } 

第二部分,得到处理过的码表
在这里插入图片描述

第三部分,解密base64,解密前顺手给密文最后一个字符“.”换成“=”
在这里插入图片描述

运行得到flag

在这里插入图片描述

VigenereLike

Ida打开
这题需要先验证id,id正确之后才能输入flag,先不管id,这玩意加密算法有点离谱,直接看flag
在这里插入图片描述

也不是很好搞,倒着来吧,从校验的部分开始,给出了密文,明显是个base64,字符串搜索也看到了码表,是标准码表。然后看最后一个加密函数
在这里插入图片描述

有个base64加密,再看看下面的加密函数
在这里插入图片描述

属于是点题函数了,一个魔改过的维吉尼亚加密。再往上看
在这里插入图片描述

一个异或,继续看下一个
在这里插入图片描述

Flag在这加了个id啥啥的,需要去掉
再往上就没什么重要的了,开始写脚本

#include<iostream>
#include<string>
using namespace std;

int ret_i(char a)
{
    string key = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ";
    for(int i = 0; i < key.length();i++)
    {
        if(key[i] == a)
        {
            return i;
        }
    }
    return -1;
}
 int main()
 {
    string a1 = "rJFsLqVyFKZOjlFHqmOZSpLsFuyqkIdxMummCrv=";
    string a2 = "";
    string key = "ISCCYESISCCYESISCCYESISCCYESISCCYESISCCY";
    string key2 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ";
    int v7 = 0;
    int res[50]{0};
    for(int i = 0; i < a1.length(); i ++ )
    {
        int v11 = ret_i(a1[i]);
        int v8 = ret_i(key[i]);
        //cout << "v11 :" << v11 << " v8: " << v8 << endl; 
        if(v11 == -1)
         {
            res[i] = a1[i];
            continue;
         }
         if(v11 < v8 )
        {
            v11 += key2.length();
            v7 = v11 - v8;
            //cout << v7 << " ";
         }
         else if(v11 > v8){
            v7 = v11 -v8;
         }
         else if(v11 == v8){
            res[i] = key2[0];
            continue;
         }
         res[i] = key2[v7];
     }
     for(int i = 0; i < 41 ;i ++)
        cout << char(res[i] );
    cout << endl;
    string ans = "Sguawub,u@O4e]oi.5t~I7S:gQOWN";//res base64解密得到的 
    for(int i =0; i < ans.length();i++)
    {
        ans[i] ^= ((i%7) + 1);
    }
    cout << ans;
     return 0;
 }

跑出来结果
在这里插入图片描述

删掉最后四个字符得到flag