히공

ShaktiCTF 2021 - deceev 본문

write up/ShaktiCTF 2021

ShaktiCTF 2021 - deceev

heegong 2021. 4. 5. 09:39
728x90

문제

 

 

 

int __cdecl main(int argc, const char **argv, const char **envp)
{
  FILE *v3; // eax
  unsigned int v4; // eax
  int result; // eax
  char *argv_1; // [esp+4h] [ebp-14h]
  char *Str; // [esp+8h] [ebp-10h]
  _BYTE *Block; // [esp+Ch] [ebp-Ch]
  int Size; // [esp+10h] [ebp-8h]
  char *base64_encode_str; // [esp+14h] [ebp-4h]

  maybe_printf(aEnterTheString);
  v3 = __acrt_iob_func(0);
  maybe_read((int)Str, 256, v3);
  v4 = strlen(Str);
  base64_encode_str = bas64_encode((int)Str, v4);
  maybe_printf(aEncodedS);
  Size = sub_4011E0(base64_encode_str) + 1;
  Block = malloc(Size);
  if ( sub_4012D0(base64_encode_str, (int)Block, Size) )
  {
    if ( argc == 2 )
    {
      argv_1 = (char *)argv[1];
      malloc(0x100u);
      sub_401510(argv_1);
    }
    Block[Size] = 0;
    sub_404792(Block);
    maybe_printf(aGoodDay);
    result = 0;
  }
  else
  {
    maybe_printf(aDecodeFailure);
    result = 1;
  }
  return result;
}

메인 함수

 

 

이 함수가 궁금했다.

 

 

 

 

int __cdecl sub_401510(char *argv_1)
{
  void *v1; // eax
  unsigned int v2; // eax
  const char *v3; // eax
  int result; // eax

  v1 = malloc(0x100u);
  sub_401490(argv_1, 0, (int)v1);
  v2 = strlen(Str2);
  v3 = bas64_encode((int)Str2, v2);
  result = strcmp(v3, Str2);
  if ( !result )
    result = maybe_printf(aYupYouGotMePYo);
  return result;
}

Str2를 살펴보니

 

 

x2JlwWFmz2w0vWpgY210M2Y1vaVpYqN1Y2xaZ3B5wC0cyTAayqVuNTFrNXVuZaNmwmpaLXJgvTN3NWt1M2JbwTNmuWx=

였다.

 

 

sub_401490이 좀 신기한 친구였다.

 

int __cdecl sub_401490(char *Str, int i, int a3)
{
  if ( i < strlen(Str) )
  {
    *(_BYTE *)(a3 + 2 * i) = Str[i];
    *(_BYTE *)(a3 + 2 * i + 1) = aBuggyM355[i % strlen(aBuggyM355)];
    a3 = sub_401490(Str, i + 1, a3);
  }
  return a3;
}

문자열 사이사이에 "buggy-m355"의 각 요소를 하나하나 가져와서 넣는 것을 알 수 있다.

재귀함수로 반복한다.

 

 

 

_BYTE *__cdecl sub_401060(int a1, unsigned int a2)
{
  unsigned int v3; // [esp+0h] [ebp-1Ch]
  int v4; // [esp+4h] [ebp-18h]
  unsigned int v5; // [esp+8h] [ebp-14h]
  _BYTE *v6; // [esp+Ch] [ebp-10h]
  int v7; // [esp+10h] [ebp-Ch]
  int v8; // [esp+14h] [ebp-8h]
  unsigned int v9; // [esp+18h] [ebp-4h]

  if ( !a1 || !a2 )
    return 0;
  v5 = sub_401000(a2);
  v6 = malloc(v5 + 1);
  v6[v5] = 0;
  v9 = 0;
  v7 = 0;
  while ( v9 < a2 )
  {
    v8 = *(unsigned __int8 *)(v9 + a1);
    if ( v9 + 1 >= a2 )
      v4 = v8 << 8;
    else
      v4 = *(unsigned __int8 *)(v9 + a1 + 1) | (v8 << 8);
    if ( v9 + 2 >= a2 )
      v3 = v4 << 8;
    else
      v3 = *(unsigned __int8 *)(v9 + a1 + 2) | (v4 << 8);
    v6[v7] = byte_413160[(v3 >> 18) & 0x3F];
    v6[v7 + 1] = byte_413160[(v3 >> 12) & 0x3F];
    if ( v9 + 1 >= a2 )
      v6[v7 + 2] = '=';
    else
      v6[v7 + 2] = byte_413160[(v3 >> 6) & 0x3F];
    if ( v9 + 2 >= a2 )
      v6[v7 + 3] = '=';
    else
      v6[v7 + 3] = byte_413160[v3 & 0x3F];
    v9 += 3;
    v7 += 4;
  }
  return v6;
}

base64다.

 

byte_413160이 table일 것 같았다.

 

 

.rdata:00413160 byte_413160     db 'A'                  ; DATA XREF: bas64_encode+EE↑r
.rdata:00413160                                         ; bas64_encode+105↑r ...
.rdata:00413161 aBcdefghijklmno db 'BCDEFGHIJKLMNOPQRSTUVWXYZzyxwvutsrqponmlkjihgfedcba0123456789+/',0

테이블이 일반적인 base64 테이블와 다른 것을 알 수 있었다.

 

 

import base64


my_base64chars  = "ABCDEFGHIJKLMNOPQRSTUVWXYZzyxwvutsrqponmlkjihgfedcba0123456789+/"
std_base64chars =  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
s = 'x2JlwWFmz2w0vWpgY210M2Y1vaVpYqN1Y2xaZ3B5wC0cyTAayqVuNTFrNXVuZaNmwmpaLXJgvTN3NWt1M2JbwTNmuWx='

c = s.translate(str.maketrans(my_base64chars, std_base64chars))
data = base64.b64decode(c).decode()
print(data)

 

 

sbhuagkgtyi-cmt3f5{5db3ucg3gpyt-1m03n5_51b5u_g3gvy3-rmy3w5h53bru3g}g

이런 문자가 출력되었다.

뭔가 이상했는데 아까 sub_401490함수에서 사이사이에 문자를 집어넣은 것이 생각났다.

 

 

 

import base64


my_base64chars  = "ABCDEFGHIJKLMNOPQRSTUVWXYZzyxwvutsrqponmlkjihgfedcba0123456789+/"
std_base64chars =  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
s = 'x2JlwWFmz2w0vWpgY210M2Y1vaVpYqN1Y2xaZ3B5wC0cyTAayqVuNTFrNXVuZaNmwmpaLXJgvTN3NWt1M2JbwTNmuWx='

c = s.translate(str.maketrans(my_base64chars, std_base64chars))
data = base64.b64decode(c).decode()


# 사이사이에 buggy-m355 없애주기
flag = ''
for i in range(0,len(data)-1,2):
  flag+=data[i]

print(flag)

플래그 : shaktictf{d3c3pt10n_15_3v3rywh3r3}

 

 

 

 

 

 

퍼블

 

 

 

 

플래그 : shaktictf{d3c3pt10n_15_3v3rywh3r3}

'write up > ShaktiCTF 2021' 카테고리의 다른 글

ShaktiCTF 2021 - Chunkies  (0) 2021.04.05
ShaktiCTF 2021 - PacMat  (0) 2021.04.05
ShaktiCTF 2021 - BomB  (0) 2021.04.05
ShaktiCTF 2021 - fusk  (0) 2021.04.05
ShaktiCTF 2021 - hack  (0) 2021.04.05
Comments