CodeEngn Basic RCE L19 Write-Up

2019. 8. 26. 21:00
728x90
728x90
728x90

파일 링크: https://codeengn.com/challenges/

 

CodeEngn.com [코드엔진] - Challenges

코드엔진은 국내 리버스엔지니어링 정보공유를 위해 2007년 부터 리버스엔지니어링 컨퍼런스 및 비공개 워크숍을 현업 실무자들과 함께 운영하고 있습니다. 리버스엔지니어링이라는 하나의 큰 주제로 소프트웨어 보안에 대한 다양한 시각과 연구주제에 대한 정보공유를 추구하고 있으며, 상업적 이익 없이 작은 예산으로 운영하고 있어 큰 예산으로 운영하는 다른 컨퍼런스에 비해 여러 가지로 부족 할 수 있습니다.

codeengn.com

[사진 1]

풀어보자.

 

 

[사진 2]

 

파일을 실행하면 메시지 박스 창이 뜨고 얼마 뒤에 종료된다.

 

 

[사진 3]

Detect It Easy 도구로 확인해보니 upx로 패킹되어 있다.

 

 

[사진 4]

위와 같이 간단하게 upx 도구로 언패킹하면 된다.

 

 

[사진 5]

올리디버거로 언패킹된 파일을 실행하면 위와 같은 메시지 박스가 뜨는데 안티디버깅으로 보인다.

 

 

[사진 6]

(F12) 키로 프로세스를 중지하고 (Alt+F9) 키를 누른 뒤, [사진 5]의 메시지 박스에서 확인 버튼을 클릭하면 위와 같이 메시지 박스 함수 호출 직후까지 실행된다. "This is a compield ~~" 문자열이 메시지 박스 함수의 인자로 스택에 저장되기 전에 0x004338DE 주소는 0x40E969 주소에서 분기된 것을 확인할 수 있다.

 

 

[사진 7]

0x0040E969 주소를 보면 IsDebuggerPresent 함수가 사용되는 것을 확인할 수 있다. IsDebuggerPresent 함수에 대한 설명은 다음 링크를 참고하면 된다.

참고 링크: https://jade9reen.tistory.com/100

 

IsDebuggerPresent Function

https://docs.microsoft.com/en-us/windows/win32/api/debugapi/nf-debugapi-isdebuggerpresent IsDebuggerPresent function (debugapi.h) Determines whether the calling process is being debugged by a user-m..

jade9reen.tistory.com

 

 

[사진 8]

안티 디버깅을 우회하기 위해 위와 같이 JNZ 명령어를 JZ 명령어로 패치하면 디버깅할 수 있다. (단, 이렇게 패치하고 일반적으로 실행할 경우 디버깅 중이라고 판단하기 때문에 정상적으로 실행되지 않는다. 일반적인 실행과 디버거를 통한 실행 모두 정상적으로 실행하려면 다른 방법으로 패치해야 한다.)

 

 

[사진 9]

[사진 2]의 메시지 박스가 뜨면 (F12) 키로 프로세스를 중지하고 (Alt+F9) 키를 누르면 위와 같이 반복 루틴 중간에 중지된다. 보면 메모리 주소 값 0x2B70과 EAX 레지스터의 값을 비교하고 앞의 값이 더 크면 분기한다.

 

 

[사진 10]

윗 부분을 보면 timeGetTime 함수가 수행되는데, 이 함수에 대한 설명은 다음 링크를 참고하면 된다.

참고 링크: https://jade9reen.tistory.com/126

 

timeGetTime Function

https://docs.microsoft.com/en-us/windows/win32/api/timeapi/nf-timeapi-timegettime timeGetTime function (timeapi.h) The timeGetTime function retrieves the system time, in milliseconds. The system tim..

jade9reen.tistory.com

 

[사진 10]의 반복문 루틴을 디버깅해보면 timGetTime 함수가 지속적으로 수행된다. timeGetTime Function 함수는 현재 시스템 시간을 반환하는데, 이 함수가 사용되고 0x2B70 값을 비교하는 것으로 보아 프로그램이 실행되고 0x2B70 값만큼 시간이 지나면 프로그램을 종료하는 것이라고 추측해볼 수 있다.

 

Auth Key 값은 0x2B70 값의 10진수 값이다.

728x90
728x90

'Wargame > CodeEngn Basic RCE' 카테고리의 다른 글

CodeEngn Basic RCE L20 Write-Up  (0) 2019.08.26
CodeEngn Basic RCE L18 Write-Up  (0) 2019.08.26
CodeEngn Basic RCE L17 Write-Up  (0) 2019.08.26
CodeEngn Basic RCE L16 Write-Up  (0) 2019.08.26
CodeEngn Basic RCE L15 Write-Up  (0) 2019.08.20

+ Recent posts