constWORLDant

ISITDTU CTF Reversing cool 본문

0x07 CTF/[스스로 푼 것]

ISITDTU CTF Reversing cool

data type ConS_tanT 2018.07.30 13:58

문제 의도 : 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 > [스스로 푼 것]' 카테고리의 다른 글

ISITDTU CTF Reversing inter  (0) 2018.08.03
ISITDTU CTF Reversing cool  (0) 2018.07.30
ISITDTU CTF Reversing Embeedding  (0) 2018.07.30
DEFCON CTF Qualifier 2018 ELF Clumber  (0) 2018.05.14
Plaid CTF ropasaurusrex Expliot  (0) 2018.05.02
whitehat malloc  (0) 2018.04.14
0 Comments
댓글쓰기 폼