[CodeEngn] BASIC RCE L11
Reversing/Reversing (Wargame)

[CodeEngn] BASIC RCE L11

파일 확인

실행

 

error 창

처음 실행하고 "확인"을 누르면 Error 창이 뜬다.

- Detect It Easy

UPX로 패킹된 파일이다!

그냥 바로 upx로 언패킹해줬다.

파일 분석

언패킹하고 바로 실행하면

깨진 문자들이 보인다.

문제에서도 알 수 있듯, 이는 "Stolen Bytes(Remove OEP)"때문에 생긴 현상이다.

 

✔ Stolen Bytes(Remove OEP)
원본 코드의 일부, 주로 OEP 코드 부분을 패커/프로텍터가 생성한 메모리 영역에 가져다 두는 기법이다.
덤프를 시켰을 때 제대로 stolen bytes를 복구하지 못하면 제대로 실행되지 않고, 언팩했을 때 우리가 아는 그런 익숙한 코드가 아닌 다른 형태의 코드들이 나타난다.
>> POPAD와 jmp OEP 사이에서 PUSH 하는 모든 코드들을 stolen bytes라고 한다.

 

다시, 패킹된 파일로 돌아가서 x32dbg로 열어서 popad를 추적해서..

이렇게 jmp 하기 전까지의 push 명령 3개를 확인할 수 있다. popad와 jmp 사이에서 반복문을 돌고 있다.

  • 6A 00
  • 68 00204000
  • 68 12204000

jmp 명령에서 스텝오버[F8]해서 OEP에 도착했다. 이 때 코드들이 지금까지 봤던 OEP에서의 코드들과 많이 다르다. (stolen bytes 때문!)

✔ stolen bytes가 있는 경우 OEP를 직접 찾았을 때, 해당 주소에서 stolen bytes의 opcode들을 1byte씩 잘라 앞에 넣는다고 생각해야한다

그래서 다시 코드의 앞부분들까지 확인해보면 NOP로 0xc byte만큼 채워져있는 것을 볼 수 있다. 그리고 stolen bytes에 해당하는 코드들의 opcode들도

6A 00 68 00 20 40 00 68 12 20 40 00 으로 총 12byte인 것을 알 수 있다.

따라서 진짜 OEP는 0x0040100c가 아니라, 0x00401000이다!

 

 

 

SMALL

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

[CodeEngn] BASIC RCE L13  (0) 2021.06.01
[CodeEngn] BASIC RCE L12  (0) 2021.05.28
[HackCTF] strncmp  (0) 2021.05.28
[CodeEngn] BASIC RCE L08  (0) 2021.05.11
[CodeEngn] BASIC RCE L06  (0) 2021.05.11