程序按26进制作了个查表,然后和7异或
void __fastcall __noreturn sub_1400010E0(char *a1, __int64 a2)
{
int v2; // er9
__int64 v3; // r8
char *v4; // r10
char v5; // al
__int64 v6; // rbx
char v7; // cl
char v8; // [rsp+1Fh] [rbp-3F9h]
char v9; // [rsp+20h] [rbp-3F8h] BYREF
v2 = 0;
v3 = (__int64)a1;
if ( a1 )
{
v4 = &v9;
do
{
++v4;
++v2;
v5 = a4890572163qwe[v3 + -26 * (v3 / 26)]; // v3%26
v3 /= 26i64;
*(v4 - 1) = v5;
}
while ( v3 );
}
v6 = v2;
while ( v6 )
{
v7 = *(&v8 + v6--);
sub_1400011E0(v7 ^ 7);
}
sub_140001220();
}
然后和已知表进行比较,一共14字节,每次比较两个,实际就是个比较。
void __noreturn sub_140001220()
{
__int64 v0; // r9
int v1; // ecx
__int64 v2; // rdx
char v3; // al
int v4; // er8
__int64 v5; // r9
char v6; // cl
int v7; // eax
v0 = qword_140004620;
v1 = 0;
v2 = 0i64;
while ( 1 )
{
v3 = *(_BYTE *)v0;
v4 = v1 + 1;
v5 = *(_QWORD *)(v0 + 8);
if ( v3 != aV4pY59[v2 - 1] ) // '/..v4p$$!>Y59-'
v4 = v1;
qword_140004620 = v5;
if ( !v5 )
break;
v6 = *(_BYTE *)v5;
v7 = v4 + 1;
v0 = *(_QWORD *)(v5 + 8);
if ( v6 != aV4pY59[v2] )
v7 = v4;
qword_140004620 = v0;
if ( v0 )
{
v2 += 2i64;
v1 = v7;
if ( v2 < 14 )
continue;
}
goto LABEL_11;
}
v7 = v4;
LABEL_11:
if ( v7 == 14 )
sub_1400012E0();
sub_1400012B0();
}
根据这个写下
a = b'/..v4p$$!>Y59-'
b = b')(*&^%489$!057@#><:2163qwe'
v = 0
for i in a:
v = v*26+b.index(i^7)
print(v)
#2484524302484524302
#flag{2484524302484524302}
这个最后提交时要加上flag{}壳,题目里没说。