본문 바로가기
# write-up/- ctf

[RC3 2016] - Reversing 350pt

by ddddh 2016. 11. 21.

대회기간 : 토요일, 19 11월 2016, 02:00 UTC — 월요일, 21 11월 2016, 07:00 UTC 

대회명 : RC3

문제 : RC3Ciper - Reversing [350pt]

RC3Cipher



제일 고득점이지만 제일 쉬운 문제. 

아마 출제자의 의도는 이렇게 푸는게 아니였지 싶다...

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