WarGame/CodeEngn

[CodeEngn] 코드엔진 - Basic RCE 9 -

문제

"StolenByte를 구하시오 Ex) 75156A0068352040"


해결

 

실행결과는 위와 같다. Key file을 제시하라는 Dialog와 찾을 수 없다는 Dialog 2가지가 연속으로 나타난다. 우리 프로그램을 HXD로 확인을 해보면 UPX Header를 확인할 수 있다.

 

우선 Stolen bytes가 무엇인지 알아야 되겠다. Stolen(훔친) - byte(바이뚜) 인데, 직역을 하면 훔친 바이트이다. 그러니까 대충 가져간 byte라는 것인데.... 

 

UPX 같은 패커는 PE 파일의 공간 압축 등을 그 목적으로 프로그램이 실행될 때 여러 번의 루프를 돌면서 원래 있던 섹션과 IAT를 복구한다. UPX는 그 특성상 PUSHAD - [압축해제 코드] - [POPAD] - [JMP OEP]의 순서로 언패킹이 이루어지는데, 이때 POPAD와 JMP OEP사이에 PUSH 명령어 등을 통해서 워래 OEP부터 실행되어야 할 코드를 스택으로 빼돌리는 것을 Stolen byte라고 부른다.

 

UPX를 언패킹 한 실행결과를 보면 조금 이해가 빠를 듯하다.

 

??? 이상한 파라미터로 MessageBoxA가 실행된 듯하다. 하단 사진은 언패킹 된 파일의 EP부터 디버거 화면이다.

MessageBoxA의 함수 파라미터는 원래 다음과 같다.

int MessageBoxA(
  [in, optional] HWND   hWnd,
  [in, optional] LPCSTR lpText,
  [in, optional] LPCSTR lpCaption,
  [in]           UINT   uType
);

물론 OPTIONAL이긴 하지만, Text와 Cpation이 깨져서 들어갔고, 정상적으로 언패킹이 이루어지지 않았다고 볼 수 있다. 그럼 이제 stolen byte를 찾으러 패킹된 실행파일을 확인해보자 여러 번의 루프를 돌고 나서 마지막으로 OEP점프 이전 다음과 같은 PUSH 3개를 발견할 수 있다.

찾았다=. 훔친 코드의 길이는 0x0040736E ~ 0x00407379까지 총 12byte가 사라졌다. 정답의 양식이 "75156 A0068352040" 인 것을 미루어보아 OP Code를 쓰면 되는 거 같다.