Iriton's log

[CodeEngn] Basic RCE - L09 본문

Reversing/Wargame

[CodeEngn] Basic RCE - L09

Iriton 2023. 11. 21. 14:40

StolenByte를 구하시오

Ex) 75156A0068352040

필요 개념 정리

  • StolenByte: 패킹된 바이너리를 언패킹할 때의 과정을 방해하기 위한 방법으로, 프로그램의 일부 바이트를 별도의 영역에서 실행되게 하여 OEP를 다른 위치로 가장하고 덤프를 쉽게 하지 못하도록 구현한 기법.따라서 OEP를 찾아서 덤프를 떠서 언팩했다고 생각하고 실행하려고 하면 실행되지 않는 것이다. OEP의 옵코드 몇 바이트가 JMP 직전에 있었기 때문에 OEP로 코드 조각이 오지 못했고, 예를 들어 함수의 인자값에 대한 push 옵코드였다면 함수의 인자가 충분하지 않으므로 실행에서 에러가 나게 되는 것이다. 이런 경우 소위 StolenByte라고 하는 옵코드를 찾아서 실행코드 부분에 복원을 해준 다음 언팩 해주어야 정상 실행이 가능하게 된다.
  • 일종의 안티디버깅 기법이라고 한다. 일부 코드 조각을 훔쳐서 다른 부분으로 옮긴 것인데 주로 OEP 주소의 코드를 따로 분리해서 OEP로 점프하기 직전에 push로 넘겨준다고 한다.
  • 덤프: 컴퓨터 주기억장치나 레지스터, 데이터, 프로그램의 전체 또는 일부 자료에 기억시킨 내용을 보조기억장치 등 기록 매체에 복사 또는 전이하는 조작.
  • 쉽게 말하면 기억장치의 내용을 전부 또는 일부를인쇄하여 출력하는 것.

문제 풀이

StolenByte란?

일종의 안티디버깅 기법이라고 한다. 일부 코드 조각을 훔쳐서 다른 부분으로 옮긴 것인데 주로 OEP 주소의 코드를 따로 분리해서 OEP로 점프하기 직전에 push로 넘겨준다고 한다.

따라서 OEP를 찾아서 덤프를 떠서 언팩했다고 생각하고 실행하려고 하면 실행되지 않는 것이다.

PEiD로 프로그램을 열어보니 UPX를 통해 패킹되어 있음을 알 수 있다.

언패킹 후 실행하니 StolenByte에 의해오류가 뜬다.

앞서 말한 StolenByte의 특징을 통해 훔쳐진 코드는 OEP로 점프하기 전에 PUSH 된다는 것을 알 수 있다.

OEP 점프하기 전에는 POPAD 명령이 실행된다는 것을 UPX 패킹 과정을 통해 알 수 있다.

즉 POPAD를 찾아가면 된다.

이때, POPAD를 찾는 방법으로 하드웨어 BP를 이용했다.

*L10 문제 풀이 中 참고

그러면 POPAD와 JMP 사이에 PUSH 명령이 보이는데, 이것이 StolenByte일 것이다.

JMP 명령어의 OEP 주소로 이동해보니 이런 식으로 NOP이 채워져 있다.

 

 

MessageBoxA function (winuser.h) - Win32 apps

Displays a modal dialog box that contains a system icon, a set of buttons, and a brief application-specific message, such as status or error information. The message box returns an integer value that indicates which button the user clicked. (MessageBoxA)

learn.microsoft.com

위 사이트를 참고하면 MessageBoxA의 함수 인자는 네 개가 필요하다.

하지만 보이는 코드에는 하나의 인자만 Push되어 있고 나머지는 Nop으로 채워져 있기 때문에 오류를 띄는 것으로 보인다.

앞서 StolenByte로 추정했던 PUSH 명령어 코드 세 개를 긁어오면 함수 인자가 네 개로 채워지므로 오류를 띄지 않을 것이다.

위에서부터 StolenByte라고 추정한 것들의 코드로 수정해준다.

*[Ctrl + E] 사용

수정 후 실행해주면 프로그램이 정상 실행된다.

'Reversing > Wargame' 카테고리의 다른 글

[CodeEngn] Basic RCE - L15  (1) 2023.11.21
[CodeEngn] Basic RCE - L10  (0) 2023.11.21
[CodeEngn] Basic RCE - L08  (1) 2023.11.15
[CodeEngn] Basic RCE - L06  (0) 2023.11.15
[CodeEngn] Basic RCE - L05  (1) 2023.11.15
Comments