바이너리 파일을 실행해보면 입력값을 요구하고 아무거나 입력을 해보면 다음과 같이 뜬다.

ida로 간단히 전체적인 로직을 확인해보면 로직은 심플하다. 길이체크하는 함수를 통해 길이를 확인하고 assign이란 함수를 통해 내 입력값을 어떠한 형태로 할당한 후 두개의 함수를 호출한 결과값이 각각 15이면 플래그가 호출된다.

 길이를 체크하는 함수를 보면 다음과 같다. 입력값에 18을 곱한 값이 27의 배수이면서 27로 나누었을 때 값이 20이면 된다. 27*20은 540이고 이를 540/18하면 입력값 길이가 30글자인 것을 알 수 있다.

다음으로 입력값을 어떠한 형식으로 재할당 하는 함수를 확인해보면 다음과 같다. 전체적인 루틴은 첫번째 파라미터로 들어온 값의 주소의 1바이트의 값들을 두번째 , 세번째 파라미터로 들어온 값의 주소에다 1바이트씩 번갈아가면서 할당한다.

어떠한 값들이 실제로 파라미터로 들어가고 실제로 위와같이 할당이 되는지 확인하기 위해 Ollydbg로 실행한 후 확인해봤다.

첫 번째 파라미터로 내 입력값이 들어가는 것을 확인할 수 있고 2,3번째 파라미터로는 특정 메모리 지역의 주소값이 할당되는 것을 확인할 수 있었다.

실제 함수 내부로 가서 로직을 살펴보면 위와 같이 내가 입력한 값을 두번째 세번째 파라미터로 넘어온 메모리 주소값에 순차적으로 저장하고 있는 것을 확인할 수 있었다.

다음으로 입력값 할당이후 첫번째 함수의 내부를 보면 위와같이 먼저 메모리의 특정주소지역에 15바이트의 값을 저장해 놓는것을 확인할 수 있었다.

다음으로 위의 루틴이 첫번째 함수의 핵심 루틴인데 간단히 분석해보면 내가 입력한 값의 15글자(짝수번째 글자)를 한글자씩 각각 총 255번 0060FAD8주소부터 저장된 255개의 글자와 비교를 해서 일치하는 값일때의 횟수를 다시 0060F6D8주소에 더해 해당하는 주소에 저장된 값이 함수 진입시에 저장되었던 15글자와 일치하는지 확인한다. 각각의 글자가 모두 위의 2가지 조건에 일치하면 해당 함수가 리턴되었을때 특정메모리값에 15라는 값이 저장되게 된다.
그렇다면 위의 조건을 만족시키기 위해 0060F6D8 주소에 저장된 값들 중에 비교대상이되는 15글자의 값들의 1바이트씩 순차적으로 몇번째 위치에 속하는지 알아낸 후 해당 위치에 속하는 0060FAD8의 값을 짝수번째 값에 순차적으로 넣어주면 된다.



다음으로 두번째 함수를 보면 위와같이 처음 저장한 15글자의 값이 다르고 홀수번째 글자와 비교한다는 것만 다를뿐 전체로직은 같기 때문에 바로 코드를 짜서 돌렸다.


'CTF > Writeup' 카테고리의 다른 글

Hack.lu CTF 2013: RoboAuth  (0) 2018.01.20
Sharif University CTF 2016 : SRM  (0) 2018.01.20
Secuinside 2013 PE time Write up  (0) 2018.01.20
Hack.lu CTF 2015: Module Loader Write up  (0) 2018.01.20
Hack.lu CTF 2014: ImageUpload Write up  (0) 2018.01.20
블로그 이미지

JeonYoungSin

메모 기록용 공간

,