히공

DaVinciCTF 2021 - Crackme 본문

write up/DaVinciCTF 2021

DaVinciCTF 2021 - Crackme

heegong 2021. 3. 20. 18:58
728x90

 

문제

 

 

 

int __cdecl main(int argc, const char **argv, const char **envp)
{
  __int64 v3; // rbp
  const char *v4; // rsi
  const char *v5; // rdi
  __int64 v6; // rdx
  int result; // eax
  unsigned __int64 v8; // rcx
  unsigned __int64 v9; // rt1
  const char **v10; // [rsp-48h] [rbp-48h]
  __int64 v11; // [rsp-38h] [rbp-38h]
  __int64 v12; // [rsp-30h] [rbp-30h]
  __int64 v13; // [rsp-28h] [rbp-28h]
  __int64 v14; // [rsp-20h] [rbp-20h]
  char v15; // [rsp-18h] [rbp-18h]
  unsigned __int64 v16; // [rsp-10h] [rbp-10h]
  __int64 v17; // [rsp-8h] [rbp-8h]

  __asm { endbr64 }
  v17 = v3;
  v10 = argv;
  v16 = __readfsqword(0x28u);
  if ( argc > 1 )
  {
    v11 = 0LL;
    v12 = 0LL;
    v13 = 0LL;
    v14 = 0LL;
    v15 = 0;
    emmdee5((__int64)&v17, (__int64)argv[1], (__int64)&v11);
    maybe_printf("%s", &v11);
    v4 = (const char *)&v11;
    if ( (unsigned int)maybe_strcmp("d2862c3379cbf547d317b3b1771a4fb6", &v11) )
    {
      v5 = "Nice try";
      maybe_puts("Nice try");
    }
    else
    {
      v4 = v10[1];
      v5 = "Well done! flag: dvCTF{%s}\\n";
      maybe_printf("Well done! flag: dvCTF{%s}\\n", v4);
    }
    result = 0;
  }
  else
  {
    v4 = *argv;
    v5 = "Usage: %s <password>\\n";
    maybe_printf("Usage: %s <password>\\n", *v10);
    result = 1;
  }
  v9 = __readfsqword(0x28u);
  v8 = v9 ^ v16;
  if ( v9 != v16 )
    result = sub_562E0E712100(v5, v4, v6, v8);
  return result;
}

메인 함수

 

 

 emmdee5함수

 

 

 

 

 

 

 

 

esrever함수

 

md5해시 값을 esrever함수를 통해 암호화를 진행하고 hex로 문자열을 만든다.

 

그게 d2862c3379cbf547d317b3b1771a4fb6와 같아야 한다.

 

 

 

 

 

import hashlib

def strlen(st):
    result = 0
    for i in st:
        if i==0:
            return result
        result+=1
    return result

md5_st = "111111111"                                                                        # 사용자 입력 값
md5_hash = hashlib.md5(md5_st.encode()).hexdigest()

md5_hash = [int(md5_hash[i:i+2], 16) for i in range(0,len(md5_hash)-1,2)]

v5 = strlen(md5_hash)
v6 = md5_hash[:]
v7 = md5_hash[v5-1:]

j = 0
while True:
    result = v5//2
    if j>=result:
        break
    md5_hash[v5-1-j], md5_hash[j] = md5_hash[j], md5_hash[v5-1-j]
    j+=1

v11 = ["%02x"%md5_hash[i] for i in range(16)]

print(''.join(v11))

문제를 구현할 수 있다.

 

 

 

st = 'd2862c3379cbf547d317b3b1771a4fb6'
md5_hash = [st[i:i+2] for i in range(0,len(st)-1,2)]

v5 = len(md5_hash)
j = 0
while True:
    result = v5//2
    if j>=result:
        break
    md5_hash[v5-1-j], md5_hash[j] = md5_hash[j], md5_hash[v5-1-j]
    j+=1

print(''.join(md5_hash))

 

이 코드를 이용해서 esrever함수에서 암호화 되기 전 상태로 복구할 수 있다.

 

출력 값이 b64f1a77b1b317d347f5cb79332c86d2이다.

 

https://www.md5online.org/md5-decrypt.html

 

이 사이트 가서 md5 복호화(?)를 진행하면

 

741852963가 정답이다.

 

 

 

 

 

플래그 : dvCTF{741852963}

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

DaVinciCTF 2021 - Rocca Pia  (0) 2021.03.20
Comments