윈도우 리버싱 문제다.
바이너리를 실행해보면 딱히 눈에 보이는 것 없이 아무것도 하지 않고 그냥 꺼진다.
ida로 코드를 확인해보면 다음과 같이 자기 자신을 재귀적으로 400번 실행하는 작업을 한다.
이 때 눈여겨 볼게 프로세스 실행을 할 때 3개의 인자가 추가되어 실행이 된다는 점이다. 이 값이 어떻게 생성되는지 확인해보면 다음과 같다.
프로세스 실행 시 입력된 인자를 통해 특정 연산들을 거쳐 새로운 인자 값을 만들어 다음 프로세스 실행 시 인자로 사용하는 걸 볼 수 있었다.
그리고 코드를 잘 보면 입력 된 인자 값을 새로운 인자 값으로 세팅하기 전에 memset으로 특정 메모리 영역을 초기화 시키는데 이 때 초기화되는 메모리 영역이 특정 함수를 통해 지정된다.
이 함수 인자로 프로세스 실행 시 사용되는 인자 2개가 사용되기 때문에 해당 함수가 어떤 작업을 하는지 살펴보았다.
코드를 보면 특정 메모리 영역에 존재하는 값을 프로세스 실행 시 사용된 인자 2개로 간단한 xor를 통해 복호화 하는 작업을 하고 있었다. 이를 통해 총 400개의 프로세스 중 정확히 복호화를 진행하는 인자 값이 존재할 거라고 생각했다.
이제 인자 값을 새로 세팅하는 로직을 분석해서 복호화를 진행하면 되는데, 코드 짜는데 시간이 좀 걸릴 것 같아서 아래와 같이 코드 패치를 통해 각 프로세스 별로 복호화된 문자열을 메시지 박스 형태로 띄우도록 했다.
이제 프로그램 실행 후 메시지박스를 계속 클릭해주다보면 다음과 같이 복호화된 문자열 중 정상적인 값이 나온다.
'CTF > Writeup' 카테고리의 다른 글
ROOT CTF 2018 ROOT_Process_1 (0) | 2018.12.30 |
---|---|
35C3 CTF 2018 php (0) | 2018.12.30 |
X-MAS CTF 2018 Web Write up (0) | 2018.12.24 |
hwp CTF 2018 unpack0r (0) | 2018.12.10 |
TenDollar CTF 2018 Cat-Proxy (0) | 2018.12.02 |