대회기간 : 토요일, 19 11월 2016, 02:00 UTC — 월요일, 21 11월 2016, 07:00 UTC
대회명 : RC3
문제 : RC3Ciper - Reversing [350pt]
제일 고득점이지만 제일 쉬운 문제.
아마 출제자의 의도는 이렇게 푸는게 아니였지 싶다...
CTF는 푸는 속도가 생명이기 때문에 풀이의 질이 다소 떨어질 수 있습니다. <- 변명
1. 흐름 파악
바이너리를 IDA로 열어서 String 값을 확인 해보면 어떠한 Hash값과 "Your ciphertext is %s"가 보인다.
입력 값을 통해 연산된 cipher text를 출력해주는 것 같다.
flay_ddddh 를 인자로 넘겨 주었을 때 암호화 된 결과 값은 입력 길이의 2배다.
그리고 "Generic response one."을 출력 해준다. 아마 "Generic response two."를 출력해주도록 하는게 답일 것 같아 보인다.
2. 동적 분석
정적 분석은 생략한다. 동적 분석 짱짱맨
친절하게 functionone, functiontwo가 보인다. 물론 그 전에도 어떠한 연산이 있지만 푸는데 지장 없으므로 생략 합니다.
eax의 0x79 ('y')의 값을 rbp-44에 넣고 밑에서 0x79만큼 반복한다.
??????
-1 을 해주면서 00까지 채운다. 근데 왜 하필 0x79 ('y') 였을까 ....
파라미타 값이 'f1ay_ddddh'였다 ?!
그렇다... 파라미타 값 중 ASCII 값이 가장 큰 값 'y'가 들어간 것이다.
3. 노가다
딴 거 다 필요 없다... 입력 값 중 가장 큰 값을 통해서 연산을 하는 것을 확인한 이상 답은 쉽게 구할 수 있다.
문제를 풀면서 알아 낸 RC3의 FLAG FORMAT은 "RC3-2016-????"이다. 그러면 입력 해 보자.
음... IDA string값으로 확인 한 hash값이랑 맞지 않는다.
비교 값 : 1b65380f084b59016875513c6373131d2a6a327172753a2918243d7b181a051e5f1e104c32331c0842777b375f100113
즉, 이 다음부터 나의 ciphertext가 1b6538.. 이 되게 가장 큰 ASCII를 찾아주면 된다.
가장 큰 값은 'Y'인 걸 확인했고, 그다음 문자도 운이 좋게 'Y'다.
입력 가능 값은 '0x59' 보다 작아야되므로 수동으로 해도 빠르게 알아낼 수 있다.
FLAG : RC3-2016-Y0UR-KSA-IS-BAD-@ND-Y0U-SH0ULD-F33L-BAD
'# write-up > - ctf' 카테고리의 다른 글
[Plaid CTF 2017] no_mo_flo (0) | 2017.04.27 |
---|---|
[ALEX CTF] RE5: packed movement (0) | 2017.02.07 |
[RC3 2016] 메모리 포렌식 - 500pt (0) | 2016.11.27 |
[RC3 2016] - Reversing 200pt (0) | 2016.11.21 |
[RC3 2016] - Reversing 100pt (0) | 2016.11.21 |