CTF | wargame

codegate 2016 / cryptinthe3sh3ll (프로그램 리소스 사용, [FindResource-SizeofResource-LoadResource-LockResource])

nopdata 2017. 3. 16. 13:09
ref : 규태햄 write up

다른길을 찾기 위해 코게 리버싱문제부터 하나씩 풀어보도록 한다.

링크 하나와 두 개의 파일이 주어진다. 링크는 youtube 영상으로 링크가 되어 있는데 제목은 Ghost in the Shell: The New Movie Trailer이며 일본 애니메이션인 공각 기동대의 영화 애니메이션 트레일러 영상 같았다.

파일은 AppJailLauncher.exe와 ProcHollow1.exe로 구성되어 있다. AppJailLauncher는 소켓 4444를 열어, 매개변수로 오는 프로그램을 외부와 접속을 시킬 수 있도록 한다.

ProcHollow1보다는 AppJailLauncher에 flag가 있을 듯 하였으나 먼저 Proc부터 분석 해 보기로 한다.

[ 실행 화면 ]

ProcHollow를 실행시켜보면 위와 같다. 이상한 점은 "계속하려면 아무 키나 누르십시오..." 메시지가 두번 뜬 다음에 작동 중지 메시지가 뜬다. 뭔가 두개의 쉘안에 들어 있는 느낌이다.

ida나 ollydbg로 디버깅 중 string을 보면 AppJailLauncher.exe가 들어가 있는 것을 볼 수 있다. 따라가 보면 createProcessA를 호출을 한다.

[ CreateProcessA ]

동일 경로에 있던 AppJail을 먼저 실행하는 것이 아니라, ProcHollow에서 실행이 되는 것이다. CreateProcess에서 CreationFlags가 중요한데 여기서는 CREATE_SUSPEND로 되어 있다. 
Create_Suspended는 스레드는 생성되지만 ResumeThread() 함수를 호출하기 전까지는 실행이 되지 않는다고 한다. (ref : http://dongwook8467.tistory.com/109)

CreateProcess의 다음 루틴을 보면 FindResource를 호출한다. FindResource는 모듈에서 리소스를 뽑아낼 때 사용한다고 한다. 파라미터로 분리해낼 실행파일 모듈(dll, exe)의 핸들값을 주어야 하는데 null을 주게 되면 현재 실행중인 데이터에서 찾아낸다고 한다.

[FindResourceA ]

보면 hModule의 값이 NULL로 되어 있는 것을 알 수 있다. 따라서, 현재 실행중인 프로그램 내에서 데이터를 찾아낸다는 것이다. 앞서, AppJailLauncher.exe를 실행 시켰으므로, 이 프로그램에서 또한 리소스를 뽑아낼 수 있다는 것이다.

[ SizeofResource ]

그 다음은 찾은 리소스의 크기를 받아오는 것이다. hResource의 값은 FindResourceA의 리턴 값이 들어가며, 리턴되는 값은 0xF400이다.

[ LoadResource ]

그 다음으로 리소스를 로드한다. 리소스 크기는 eax에 저장되어 있으며, 리턴되는 값은 리소스의 포인터이다.

[ LockResource ]

LockResource는 리소스 상에서의 포인터를 가지고 메모리 상의 실제 포인터를 가져온다고 한다. (좀 더 알아봐야 할 듯)
리턴된 주소를 dump창에서 보면 프로그램 바이너리가 로드 된 것을 볼 수 있다.

[ VirtualAlloc ]

메모리 할당 함수를 호출한다. malloc과 비슷한데 좀 더 세부적인 컨트롤이 가능하다고 한다.

[ memcpy ]
메모리 복사를 하는데, 로드된 리소스를 특정 메모리로 복사를 하게 된다. 여기까지 보면 프로그램 흐름은 다음과 같다.
AppJailLauncher.exe 로드 -> 리소스 추출 -> 메모리로 복사


실제로 decrypt : ~ 메시지가 콘솔에 띄워지는 부분을 보면 NtResumeThread함수가 호출 되면서 된다. ntdll내부 함수이기 때문에 더 이상 진입해서 분석하는 것은 무의미하다.
대신 그 전에 보면 NtWriteVirtualMemory를 호출하는 부분이 총 3번 있다. 이름에서도 볼 수 있듯 할당된 메모리에 데이터를 쓰는 작업을 한다.
3~4번정도의 반복 구문을 도는데 어떤 동작을 하는지는 파악하지 않았다. 더 보아야 할 부분은 이 프로그램이 아닌 로드된 리소스 프로그램이다.

이전에 memcpy로 복사된 데이터나, 복사되기 전 데이터를 추출해서 실행시켜보면 decrypt : ~메시지가 뜨게 된다. 이걸 분석해야 한다.

[ sub_402140 ]

decrypt 메시지를 출력하는 함수를 보면 위와 같이 되어 있다. for 문이 두번 돌면서 연산을 진행하는데, 위에서 나오는 데이터 중 0~16인 ARIA_IS_GOOOD!~!이 답이 된다.

flag : ARIA_IS_GOOOD!~!