Information Security Study

[CodeEngn] Basic RCE L11 본문

Reversing/CodeEngn

[CodeEngn] Basic RCE L11

gayeon_ 2023. 5. 9. 18:22

문제: OEP를 찾으시오. Ex) 00401000 / Stolenbyte 를 찾으시오.
Ex) FF35CA204000E84D000000 정답인증은 OEP+ Stolenbyte
Ex ) 00401000FF35CA204000E84D000000

 

 

 

문제 파일을 실행해 보았다.

 

 

 

PEiD에 올려보니 UPX로 패킹되어있음을 알 수 있었다.

 

 

 

CFF Explorer로 언패킹했다.

 

 

 

StolenByte

- 안티디버깅 기법 중 하나이다

- OEP 주소의 코드를 따로 분리해서 OEP로 점프하기 직전에 push로 넘겨준다

- OEP의 옵코드 일부가 JMP 직전에 있어서 OEP로 코드 조각이 오지 못했고, 이 경우 StolenByte라는 옵코드를 찾아 실행코드 부분에 복원해준 다음 언팩을 해주어야 정상 실행이 가능하다

 

 

 

StolenByte를 찾기 위해 x64dbg에서 OEP로 점프하는 부분을 찾아서

그 직전에 push하는 부분을 살펴보았다.

 

PUSHAD 명령어를 한 줄 실행시켜 레지스터들을 스택에 저장시킨다.

 

그리고 PUSHAD 후에 ESP값에 접근하는 지점에 BP를 설정한다.

 

F9로 실행시켜보면, 실행하다가 POPAD 아래에서 멈추는 것을 알 수 있다.

아래의 JMP 40100C가 OEP이고, 0x40736E부터 3줄이 StolenByte일 것이다.

 

 

 

 

MessageBoxA

파일이 언패킹 된 상태일 때, MessageBoxA에 인자가 하나만 들어간 걸 볼 수 있지만 원래 인자가 4개 들어가야 한다. 따라서 사라진 3개의 인자가 push되어야 하고, 결국 StolenByte는 3줄이다.

 

 

이제 StolenByte를 써서 정상적인 파일이 됐다고 가정했을 때의 OEP를 구해보자.

StolenByte는 MessageBoxA의 인자로 들어가므로 MessageBoxA가 call되는 0x40100C 윗부분의 nop부분에 들어간다.

 

 

nop 부분을 드래그해서 Ctrl + E를 눌러 코드 편집창을 연 후, StolenByte의 Hex값을 모두 써준다.

 

 

 

그러면 OEP가 0x401000인 파일이 완성된다!

 

 

 

따라서 OEP는 00401000이고, StolenByte는 기계어 6A00 6800204000 6812204000를 합쳐서 6A0068002040006812204000이 된다.

OEP와 StolenByte를 합치면 004010006A0068002040006812204000이다.

 

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

[CodeEngn] Basic RCE L14  (0) 2023.05.11
[CodeEngn] Basic REC L12  (0) 2023.05.09
[CodeEngn] Basic RCE L07  (0) 2023.03.30
[CodeEngn] Basic RCE L06  (0) 2023.03.30
[CodeEngn] Basic RCE L05  (0) 2023.03.28