CodeEngn Basic RCE L19 Write-Up
파일 링크: https://codeengn.com/challenges/
CodeEngn.com [코드엔진] - Challenges
코드엔진은 국내 리버스엔지니어링 정보공유를 위해 2007년 부터 리버스엔지니어링 컨퍼런스 및 비공개 워크숍을 현업 실무자들과 함께 운영하고 있습니다. 리버스엔지니어링이라는 하나의 큰 주제로 소프트웨어 보안에 대한 다양한 시각과 연구주제에 대한 정보공유를 추구하고 있으며, 상업적 이익 없이 작은 예산으로 운영하고 있어 큰 예산으로 운영하는 다른 컨퍼런스에 비해 여러 가지로 부족 할 수 있습니다.
codeengn.com
풀어보자.
파일을 실행하면 메시지 박스 창이 뜨고 얼마 뒤에 종료된다.
Detect It Easy 도구로 확인해보니 upx로 패킹되어 있다.
위와 같이 간단하게 upx 도구로 언패킹하면 된다.
올리디버거로 언패킹된 파일을 실행하면 위와 같은 메시지 박스가 뜨는데 안티디버깅으로 보인다.
(F12) 키로 프로세스를 중지하고 (Alt+F9) 키를 누른 뒤, [사진 5]의 메시지 박스에서 확인 버튼을 클릭하면 위와 같이 메시지 박스 함수 호출 직후까지 실행된다. "This is a compield ~~" 문자열이 메시지 박스 함수의 인자로 스택에 저장되기 전에 0x004338DE 주소는 0x40E969 주소에서 분기된 것을 확인할 수 있다.
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
안티 디버깅을 우회하기 위해 위와 같이 JNZ 명령어를 JZ 명령어로 패치하면 디버깅할 수 있다. (단, 이렇게 패치하고 일반적으로 실행할 경우 디버깅 중이라고 판단하기 때문에 정상적으로 실행되지 않는다. 일반적인 실행과 디버거를 통한 실행 모두 정상적으로 실행하려면 다른 방법으로 패치해야 한다.)
[사진 2]의 메시지 박스가 뜨면 (F12) 키로 프로세스를 중지하고 (Alt+F9) 키를 누르면 위와 같이 반복 루틴 중간에 중지된다. 보면 메모리 주소 값 0x2B70과 EAX 레지스터의 값을 비교하고 앞의 값이 더 크면 분기한다.
윗 부분을 보면 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진수 값이다.
'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 |