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}