문제입니다.

파일을 실행해보니 일정시간이 지난 후 프로그램이 종료 되었습니다.

UPX로 패킹이 되어있네요

01_unpack.exe라는 파일명으로 언패킹을 진행했습니다.

올리디버거로 언패킹된 파일을 열고 [Search for] -> [All Intermodular calls]로 들어가서 API를 확인해 보았습니다. 먼저 눈에 띄는 함수는 IsDebuggerPresent() 함수입니다.

안티디버깅 함수이며 디버거가 실행중일 경우 리턴값이 0이 아닙니다.

다음 함수를 찾아보겠습니다.

다음은 timeGetTime 입니다.

윈도우 시작후 경과된 시간을 반환합니다.

"CALL EDI"로 들어가보겠습니다.

중요한 부분만 간략히 설명하면 444C44 에서 현재 경과시간을 구한 후 444C4D에서 반환값을 ESI에 저장하고 있습니다. 이후 444C5F에서 "CALL EDI"를 통해 현재 경과시간을 한번 더 구한 후

CMP EAX, ESI 를 통해 이전 경과시간과 현재 경과시간을 비교하고 있습니다.

그리고 EAX가 더 크면 444D38로 점프를 합니다.

그럼 444D38로 가보겠습니다.

444D38에서 SUB EAX,ESI 를 하여 첫번째 경과시간과 두번째 경과시간의 차를 구한 후

444D3A에서 [EBX+4]의 값과 비교를 하고 있습니다.

그리고 비교한 결과 EAX가 [EBX+4] 보다 크면 444C71로 점프하여 종료 루틴으로 빠지게 되며 EAX가 더 작을 경우 444C5F로 점프하여 CALL EDI를 통해 현재 경과시간을 얻어오고 비교하는 루틴으로 반복이 됩니다.

그럼 [EBX+4]의 값을 한번 알아보겠습니다.

현재 EBX에는 "8AF890"이 들어있고 +4 한 값은 "8AF894"가 되므로 해당 주소로 가서 값을 확인해 보겠습니다.

"0x337B" 이 들어있습니다.

"0x337B"는 10진수 13179입니다.

13.179ms 가 됩니다.

문제에서 이 값을 MD5 대문자로 변환하여 인증을 하라고했으므로

이 값을 인증하면!

Advance RCE L01 성공!

'WAR GAME > CodeEngn(Advance)' 카테고리의 다른 글

Advance RCE L06  (0) 2020.04.29
Advance RCE L05  (0) 2020.04.29
Advance RCE L04  (0) 2020.04.29
Advance RCE L03  (0) 2020.04.29
Advance RCE L02  (0) 2020.04.29

+ Recent posts