문제입니다.

파일을 실행해보니 일정시간 이후 메시지가 사라집니다.

UPX로 패킹이 되어 있어서 언패킹을 진행했습니다.

언패킹된 화면입니다.

먼저 올리디버거를 킨 후

[Search for] -> [All Intermodular calls]를 클릭하여 time관련함수를 찾아보았습니다.

time관련함수를 찾다가 안티디버깅 함수를 찾았습니다.

timeGetTime 이라는 함수도 보입니다.

timeGetTime함수는 운영체제가 시작한 이후 현재까지 흐른 시간을 1/1000초 단위(ms)로 반환합니다.

timeGetTIme함수를 전체를 break point를 걸고 테스트 해보았으나 적용이 되지 않아 하나씩 break point를 걸고 확인해야 합니다.

먼저 안티디버깅을 우회 하도록 하겠습니다.

안티디버깅을 우회 하기위해 40e969 부분의 JNZ부분을 JE로 바꾸어 주었습니다.

그리고 F9를 이용하여 timeGetTime부분으로 이동해 보겠습니다.

첫번째 "CALL EDI"을 통해 나온 결과를 "MOV ESI, EAX"를 통해 ESI에 저장하고 있습니다.

이후 sleep()을 거친 후 두번째 "CALL EDI"를 통해 경과시간을 추출하여 EAX에 저장하고 있습니다.

이후 "CMP EAX, ESI"를 통해 현재시간과 이전시간을 비교 후 EAX가 적지 않을 때 444D38로 점프를 하게 됩니다.즉, 시간이 경과 했을 때 점프를 하게 됩니다.

444D38로 점프 후 두 값의 차이를 구해 EAX에 저장합니다.

이후 CMP EAX, DWORD PTR DS:[EBX+4]를 통해 저장된 시간과 EAX를 비교하게 됩니다.

EAX값에 따라 적지 않으면 444C71루틴으로 적으면 444C5F로 이동하게 됩니다.

EBX+4를 확인해보니 0X2B70이 들어있었습니다.

"0x2B70"은 11120 이네요 ~

지정 시간은 즉, 11120ms 입니다.

Basic RCE L19 성공!

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

Basic RCE L20  (0) 2020.04.29
Basic RCE L18  (0) 2020.04.29
Basic RCE L17  (0) 2020.04.29
Basic RCE L16  (0) 2020.04.29
Basic RCE L15  (0) 2020.04.29

+ Recent posts