본문으로 바로가기

[DIMICTF] keychecker (write - up)

category Reversing/CTF Write-up 2020. 1. 16. 17:40

DIMICTF qual keychecker

Analysis

int __cdecl main(int argc, const char **argv, const char **envp)
{
 const char *v3; // rdi

 if ( argc != 3 )
{
   printf("%s [mod] [text]\n", *argv, envp);
   exit(1);
}
 if ( !strcmp(argv[1], "encode") )
{
   encode(argv[2]);
}
 else if ( !strcmp(argv[1], "decode") )
{
   v3 = argv[2];
   decode();
}
 return 0;
}

아주 간단한 프로그램. 인자로 encode를 넘겨주면 뒤의 string을 암호화해준다. decode는 구현안됨


__int64 __fastcall encode(const char *string)
{
 signed int j; // [rsp+Ch] [rbp-24h]
 int i; // [rsp+10h] [rbp-20h]
 int bin; // [rsp+14h] [rbp-1Ch]
 _BYTE *buf; // [rsp+18h] [rbp-18h]
 int len; // [rsp+24h] [rbp-Ch]

 len = strlen(string);
 buf = malloc(9 * len);
 for ( i = 0; i < len; ++i )
{
   string[i] ^= 35u;
   bin = string[i];
   for ( j = 0; j < 8; ++j )
  {
     buf[8 * i + j] = bin % 2 + 0x30;
     bin /= 2;
  }
}
 printf("%s\n", buf);
 return 0LL;
}

하는 일들을 보면 아래와 같다.

  1. string[i] ^ 35한다.

  2. for문 돌면서 2진수로 변환하는데, 여기서 값이 거꾸로 나온다.

    • 01001으로 나와야하는데 10010으로 나오는 느낌.

고대로 코드짜서 복호화하면 된다.


Dncrypt flag

hello = "1110011001010110011101100101011000011010100001100100100010110010001111101110101011001000001111100110100011101010100011100100100010110110001000100011111011100010010010001011001000100110001111101110011011001000101100100010001001111010"

sp = []
string = ""
for i in range(len(hello)): # 8글자단위로 reverse해서 넣음
    string += hello[i]
    if (len(string) / 8) >= 1:
        sp.append(string[::-1])
        string = ""

flag = ""

for i in range(len(sp)): # XOR후 string으로 변환
    flag += chr(int(sp[i],2) ^ 35)

print flag