[그림1] stolenbyte를 구하는 문제
[그림2] 실행창1
[그림3] 실행창2

 

StolenByte

 패킹된 바이너리를 언패킹할 때의 과정을 방해하기 위한 방법으로, 프로그램의 일부 바이트를 별도의

영역에서 실행되게 하여 OEP를 다른 위치로 가장하고 덤프를 쉽게 하지 못하도록 구현한 기법

 

 패커가 패킹을 진행할 때, 원본 코드 중 일부를 다른 곳으로 이동 시킨 코드로써, 주로 EP 위의 몇 줄의 코드이다

 

  올바른 프로그램을 얻기 위해서는 패킹 과정에서 떼어진 StolenByte를 함께 복원해야 덤프가 성공적으로 이루어진다

 

[그림4] 프로그램의 시작 코드가 PUSHAD로 되어 있다. 패킹된 파일임을 짐작할 수 있다.

 

[그림5] PEiD로 확인한 결과. 역시 UPX 로 패킹이 되어있다.

 

[그림6] upx -d 옵션을 활용해 unpacking

 

[그림7] unpacking 후 확인한 코드
[그림8] 0040100E 주소의 MessageBox함수 호출 결과

unpacking 후 디버거로 열었을 때, 처음에 NOP로 덮어진 부분이 눈에 띄었다.

첫 번째로 실행되는 MessageBoxA 함수에 전달할 인자가 부족함을 알 수 있었고

이를 실행했을 때, 온전하지 못한 글자들과 함께 결과가 보여짐을 확인할 수 있었다.

 

이를 통해 부족한 인자들이 문제와 연관있음을 예측했다.

 

 

[그림9] unpacking 하지 않은 실행파일의 POPAD 부분 확인

unpacking 시 stolenbyte 문제가 생긴다는 것을 깨달은 후,

다시 원본 실행 파일에서 POPAD 부분을 찾아갔다.

(POPAD 찾는 방법은 아래를 확인)

2021.04.07 - [Study/Reversing] - CodeEngn Challenge : Basic RCE L06

 

그리고 POPAD 이후 스택에 적재되는 세 개의 값을 확인할 수 있었다.

 

OEP로 점프하는 구간에 BP를 걸고 실행시켰더니

MessageBoxA 함수 호출에 필요한 인자들이 스택에 PUSH 됨을 알 수 있고,

이를 통해 PUSH 되는 인자들이 StolenByte 임을 확인했다.

 

 

[그림10] NOP로 덮여진 부분

 

[그림11] [Ctrl+E] 로 코드 변경

 

[그림12] 정상적 unpacking 성공

 

따라서 stolenbyte는 6A0068002040006812204000 이다.

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

CodeEngn Challenge : Advance RCE L09  (0) 2021.04.28
CodeEngn Challenge : Advance RCE L03  (0) 2021.04.28
CodeEngn Challenge : Basic RCE L06  (0) 2021.04.07
CodeEngn Challenge : Basic RCE L16  (0) 2021.03.30
CodeEngn Challenge : Basic RCE L15  (0) 2021.03.30

+ Recent posts