히공

ShaktiCTF 2021 - PacMat 본문

write up/ShaktiCTF 2021

ShaktiCTF 2021 - PacMat

heegong 2021. 4. 5. 10:14
728x90

문제

 

 

 

 

exe파일이고 gui 프로그램이다.

 

 

 

 

WinProc에서 분기점을 찾았다.

 

sub_411109 이 함수를 분석해보자

 

 

// attributes: thunk
int sub_411109(void)
{
  return sub_411F90();
}

함수 내부에서 함수를 호출한다.

 

 

 

 

int sub_411F90()
{
  __int64 v1; // [esp+Ch] [ebp-138h]
  int v2; // [esp+D8h] [ebp-6Ch]
  char v3[20]; // [esp+E4h] [ebp-60h] BYREF
  int v4[11]; // [esp+F8h] [ebp-4Ch]
  int v5; // [esp+124h] [ebp-20h]
  int j; // [esp+130h] [ebp-14h]
  int i; // [esp+13Ch] [ebp-8h]

  __CheckForDebuggerJustMyCode(&unk_41C018);
  j_memcpy(Str, Src, 0x35u);
  if ( j_strlen(Str) != 0x34 )
    return 0;
  MessageBoxA(0, "Thanks for your input", "Gratitude", 0);
  v4[0] = 22;
  v4[1] = 91;
  v4[2] = 7;
  v4[3] = 3;
  v4[4] = 7;
  v4[5] = 41;
  v4[6] = 7;
  v4[7] = 18;
  v4[8] = 69;
  v4[9] = 25;
  v4[10] = 124;
  v5 = 77;
  qmemcpy(v3, "e3fhs@df#b]0", 12);
  for ( i = 0; i < 10; ++i )
  {
    if ( (v3[i] ^ Str[i]) != v4[i] )
      return 0;
  }                                             // 아마 shakictf{
  HIDWORD(v1) = (v3[i] ^ Str[50]) != v4[i];
  LODWORD(v1) = (v3[11] ^ Str[51]) != v5;
  if ( v1 )
    return 0;
  v2 = 10;
  for ( i = 0; i < 5; ++i )
  {
    for ( j = 0; j < 8; ++j )
    {
      if ( (Str[j + i + v2] ^ 8) != dword_41A000[5 * j + i] )
        return 0;
    }
    v2 += 7;
  }
  return 1;
}

간단한 코드였다. (사실 dword_41A000[5 * j + i] 이 친구 덕분에 삽질 좀 한...ㅎㅎ..)

 

 

 

 

 

 

v3 = "e3fhs@df#b]0"
v4 = [22,91,7,3,7,41,7,18,69,25,124]

flag = [0]*52
for i in range(10):
    flag[i] = chr(ord(v3[i]) ^ v4[i])

i+=1
flag[50] = chr(ord(v3[i]) ^ v4[i])
flag[51] = chr(ord(v3[11]) ^ 77)


v2 = 10
dword_41A000 = '39 00 00 00 60 00 00 00 38 00 00 00 7F 00 00 00 64 00 00 00 57 00 00 00 3C 00 00 00 66 00 00 00 39 00 00 00 38 00 00 00 60 00 00 00 7C 00 00 00 7C 00 00 00 7C 00 00 00 7A 00 00 00 38 00 00 00 57 00 00 00 39 00 00 00 60 00 00 00 69 00 00 00 78 00 00 00 7F 00 00 00 66 00 00 00 57 00 00 00 7C 00 00 00 6D 00 00 00 3B 00 00 00 7D 00 00 00 3B 00 00 00 61 00 00 00 57 00 00 00 57 00 00 00 6D 00 00 00 70 00 00 00 38 00 00 00 7C 00 00 00 6B 00 00 00 57 00 00 00 78 00 00 00 66 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
dword_41A000 = dword_41A000.replace('00','')
dword_41A000 = bytes.fromhex(dword_41A000)

for i in range(5):
    for j in range(8):
        flag[j+i+v2] = chr(dword_41A000[5*j + i] ^ 8)
    v2+=7



flag = ''.join(flag)
print(flag)

 

플래그 : shaktictf{1_h0pe_th4t_w3_c0nt1nue_w1th_3xpl0rati0n!}

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

ShaktiCTF 2021 - pillow  (1) 2021.04.05
ShaktiCTF 2021 - Chunkies  (0) 2021.04.05
ShaktiCTF 2021 - BomB  (0) 2021.04.05
ShaktiCTF 2021 - fusk  (0) 2021.04.05
ShaktiCTF 2021 - deceev  (0) 2021.04.05
Comments