收获

  • 逆向代码逻辑

  • 注意 IDA 伪代码中有一些数据的一部分会用其他变量来表示,记得拼接


(2023年5月1日-2023年5月25日)【ISCC 2023】Convert


思路

定位到主函数:

ISCC2023-Convert1.png

分析可知:
sub_4865AD(&unk_5DC488, &byte_5A04DC)printf("请输入flag:\n")
sub_484D2F(&dword_5DC3E0, v5)scanf("%s", v5)
逻辑比较简单,就是将输入 v5 进行处理后与 v8 进行比较,如果相同则获得 flag

主要的处理逻辑在 sub_488B0A(v5, v7, v6) 中,sub_488B0A(v5, v7, v6) 会调用 sub_499080(a1, a2, a3)

ISCC2023-Convert2.png

这里的逻辑也不复杂,直接将这个算法逆过来即可

注意伪代码中的 v9,其实也是密文的一部分
完整的密文内容为 v8v9


脚本

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

int main(){  
    char v7[12]; // [esp+10Ch] [ebp-30h] BYREF  
    char v8[24]; // [esp+118h] [ebp-24h] BYREF  
    v8[0] = '(';  
    v8[1] = '0';  
    v8[2] = '$';  
    v8[3] = '$';  
    v8[4] = 'b';  
    v8[5] = 25;  
    v8[6] = 9;  
    v8[7] = 15;  
    v8[8] = 14;  
    v8[9] = 42;  
    v8[10] = 37;  
    v8[11] = 18;  
    v8[12] = -85;  
  
    v8[13] = 'B';  
    v8[14] = 'D';  
    v8[15] = 'W';  
    v8[16] = 'G';  
    v8[17] = '\'';  
    v8[18] = '*';  
    v8[19] = '*';  
    v8[20]= '5';  
    v8[21] = ':';  
    v8[22] = 's';  
    v8[23] = 0;  
  
    strcpy(v7, "ISCC");  
    int v6 = 23;  
  
    for (int j = 0; j < 4; ++j )  
    {  
        v8[16 + j] -= v7[j] / 5;  
        v8[12 + j] -= v8[4 + j];  
        v8[8 + j] -= 2 * j;  
        v8[4 + j] -= v7[j] % 5;  
        v8[j] -= j ^ -(v7[j] % 4);  
    }  
  
    for (int i = 0; ; ++i )  
    {  
        if ( i >= v6 )  
            break;  
        v8[i] -= i;  
        v8[i] += 32;  
  
    }  
  
    for (int k = 0; k < 24; ++k) {  
        printf("%c", v8[k]);  
    }  
    return 0;  
}

结果

ISCC{1!&&?7!]<MYI&+*AE}

ISCC2023-Convert3.png