2018. 7. 30. 13:58ㆍ0x07 CTF/[스스로 푼 것]
문제 의도 : md5 decrypt && xor value
바이너리를 실행하면 전형적인 키 값 입력 리버싱 문제임을 알 수 있다.
이러한 문제는 루틴을 잘 이해해야 한다.
코드를 보고 판단해보자.
antidebug가 있지만 이건 간단하게 patch를 할 수 있으니 굳이 신경쓰지 않아도 된다.
위에 알 수 없는 문자열들은 32바이트 즉, md5이다.
md5 decrypt를 하면 fl4g _i5_ h3r3 이라는 값을 볼 수 있다.
해당 문제의 핵심은 이 부분이라고 볼 수 있다.
convert_md5함수에 접근해보자.
입력한 data가 고정 되어있는 md5값과 같은지 다른지 체크하는 부분이 있다.
같든 다르든 메모리 해제(free)를 해준다.
convert_md5의 반환 값에 따라 fail()로 갈 지 새로운 작업을 진행할 지 결정되게 된다.
이런 시나리오를 생각해볼 수 있다.
임의 의 값 입력 -> md5 encoding -> 값 vs ECFD4245812B86AB2A878CA8CB1200F9 일치 여부
-> 같다면 다음 루틴 진행
쭉 반복해보면, fl4g_i5_h3r3! 까지 구할 수 있고, 우리는 if (strlen(flag) != 28) 에서 실제 플래그의 길이가 28자리인것을 알고 있기 때문에
현재 구한 것은 13바이트, 15바이트가 모자란 것을 눈치 챌 수 있다.
나머지 15바이트는 이 루틴에서 결정 된다.
xor_val은 다음과 같다.
저 값을 이용해서 연산을 수행하면 된다.
flag = "fl4g_i5_h3r3!"
data = "7D4D2344360276036F5B2F46761839".decode("hex")
m = 0
for i in flag:
# print chr(ord(i))
m = m ^ ord(i)
# print m
for i in data:
flag += chr(m ^ ord(i))
m = m ^(m ^ ord(i))
# print m
print flag
'0x07 CTF > [스스로 푼 것]' 카테고리의 다른 글
HexionCTF XOR - Crypto (0) | 2020.04.18 |
---|---|
ISITDTU CTF Reversing inter (0) | 2018.08.03 |
ISITDTU CTF Reversing Embeedding (0) | 2018.07.30 |
ISITDTU PWN Unexploitable 미완성 (0) | 2018.07.30 |
0ctf_momo_3 (0) | 2018.06.10 |