【ISCC 2023】Convert
收获
逆向代码逻辑
注意 IDA 伪代码中有一些数据的一部分会用其他变量来表示,记得拼接
(2023年5月1日-2023年5月25日)【ISCC 2023】Convert
思路
定位到主函数:
分析可知: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)
:
这里的逻辑也不复杂,直接将这个算法逆过来即可
注意伪代码中的 v9
,其实也是密文的一部分
完整的密文内容为 v8
和 v9
脚本
#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}
评论