[Codegate 2018] Rev – RedVelvet

Happiness! 뮤비 한번 보고 갑시다.

파일을 다운로드 후 압축을 풀면 RedVelvet이라는 파일이 하나 나타납니다. 이는 64bit ELF 파일입니다.

먼저 실행시켜봅시다.

Your flag : 라는 문자열이 나타나고, 입력을 기다립니다. 아무 문자열이나 입력해주면 실행이 그냥 종료되는데, 특정한 조건을 맞춰 입력하지 않으면 exit()을 실행하여 프로그램을 종료시키는 형태인 것 같습니다.

IDA에 올린 후 String view를 이용해 살펴보면 위와 같이 flag를 출력하는 부분임을 암시하는 문자열이 존재합니다. 이를 따라가보면 main함수를 확인할 수 있습니다.

메인함수 내에는 위와 같은 형태로 프로세스를 진행하는데, func1~func15가 메인 프로세스이며, 마지막 비교 구문을 통해 플래그를 출력해줍니다. func1~func15를 살펴보면 이전 함수의 두번째 파라미터가 다음 함수의 첫번째 파라미터로 들어가는 것으로 보아 한글자 한글자씩 비교하는 형태로 보이며, 이를 모두 만족했을 경우 도출되는 문자열을 SHA256 알고리즘으로 해시 후 s2~v47에 해당하는 해시값과 동일할 경우 플래그임을 알려줍니다.

딱 봐도 angr를 이용하면 슥삭 할 수 있을 것 같은 문제지만, 저는 리알못이기 때문에 angr 대신 z3를 이용해 한글자 한글자 맞춰보는 삽질을 했습니다.

gdb를 이용해 main함수를 살펴보면 func1 함수의 인자로 esi, edi를 넘겨줍니다.

main+257의 위치에 breakpoint를 걸고 해당 값을 확인해봅시다.

예상대로 1234를 입력했을 경우 1, 2를 순서대로 파라미터로 받는 것을 알 수 있습니다.

이제 IDA로 돌아와서 함수들의 조건을 맞춰 HAPPINESS:)를 출력할 수 있도록 조건을 확인해봅시다. 앞서 말했던대로, 저는 z3를 이용하여 한글자 한글자 추려냈습니다.

한글자 한글자 삽질하며 찾아가다 보면 What_You 와 같이 문장으로 예상되는 단어가 나타납니다.

???????

Be? 이후 나머지 함수들의 결과를 찾아가다 보면 아래와 같은 플래그를 찾아낼 수 있습니다.

FLAG : What_You_Wanna_Be?:)_la_la

+ Recent posts