Wargame[워게임]/CodeEngn

CodeEngn.com Basic RCE L10 WriteUp

SuperVingo 2020. 7. 29. 03:10
728x90

OEP를 구하는 문제는 많이 해봤지만, UPX 패킹에 한정되서였다. 이번에는 다른 종류의 패킹을 보고, 직접 언패킹해볼 예정이다.

 

0. ExeInfoPE 분석

이번엔 익숙한 UPX가 아닌 생소한 Aspack이라는 패킹 툴이다. 하지만, 겁먹을거 없다. UPX와 언패킹 과정은 비슷하다.

PUSHAD -> 언패킹 -> POPAD -> JMP OEP이다. 그럼 빠르게 시작해보자.

 

1. 올리디버거 분석

올리디버거가 딱 PUSHAD부분에서 멈춰줬다. 그러면 POPAD를 찾으면되는데, 우리는 무식하게 눈으로 확인했지만, 이제는 다르게 접근해보도록 하겠다. PUSHAD와 POPAD가 일단 어떤 명령어인지 알아보고 가자.

 

PUSHAD:
범용 레지스터들의 값들을 Stack에 저장.

POPAD:
Stack에 값들을 범용 레지스터에 대입.

 

이러한 명령어이다. 이 때, Stack에 값을 대입하므로 Stack을 가르키는 ESP(Extended Stack Pointer)의 값이 변경될 것이다. 또한, PUSHAD로 범용 레지스터 값들을 저장한 후, 복구하기 위해서 다시 POPAD를 할 때, 스택의 값을 변경할 것이다. 이를 통해서 PUSHAD 이후 ESP값에 BP를 걸고 실행하면 POPAD 직후에 멈추게 될것이다. 한번 실험해보자.

 

올리디버거에서 Step Over(F8)을 통해서 PUSHAD만 실행했을 때 ESP 값이다. 

이제 아래 메모리 덤프창에서 Ctrl + g를 통해서 ESP값의 주소로 이동해준다.

이렇게 이동한 후, 오른쪽 클릭 -> BreakPoint -> Hardware를 통해 DWORD(4바이트)크기 만큼 BP를 설정해준다.

설정해주면 이렇게 빨간색으로 바뀌게 된다. 이제 F9를 눌러 실행하여 POPAD에서 멈추는지 확인해보자.

 

TADA! 이렇게 잘 POPAD 부분에 도착한 것을 볼 수 있다. 그리고 PUSH (Address) 후 RETN을 진행한 것으로 보아 PUSH해준 Address가 OEP인것을 알 수 있다. 그럼 우리의 첫번째 목표인 OEP는 구했고, 이제 등록 성공으로 분기하는 OPCODE를 찾으러 가보자. F8을 통해서 OEP로 진입해주자.

OEP로 진입해도 뭐 보이는게 없다. 하지만 우리에겐 올리디버거가 있다. 오른쪽 클릭 -> Search For -> All referenced strings를 통해 찾아보면

성공 문자열을 찾을 수 있었고,

분기되는 지점도 쉽게 찾을 수 있었다.

728x90