[ctf.show.reverse] 逆向4

程序按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{}壳,题目里没说。

你可能感兴趣的:(CTF,reverse,reverse)