pcsurgeon.exe 실행

pcsurgeon 프로그램을 실행했더니

다양한 dll, 드라이버, 시스템 파일이 생겼으며

저런 창이 떴다.

Register for only $20.00 ~ / You have 5 days remaining~ 로 뜨는 것을 보아

"Register를 해야하는 문제" 혹은 "5일 이라는 제한을 없애는"게 목적이라고 생각했다.

 

메인 화면
Help - About

Reg Key를 사용해서 Register 하는 것 같다.

 

 

 

 일단은 메인 화면 상단에서 <unregistered - 5 days remaining..>

문자열이 뜨는 것을 지워보겠다.

 

&amp;nbsp;문자열로 찾기
해당 부분 더블클릭!

검색된 문자열에서 바로 위를 보니 분기문이 2개가 보인다.

일단 직접적으로 관련이 있어보이는 바로 위 분기문

 

 

( MOV ) [60F1DC] 주소에 저장된 값을 EAX에 레지스터에 저장한 후 

( CMP  )                                                          ‘0’과 비교하여 

( JNZ   )                          분기문이 실행되는 것을 확인할 수 있다.

 

 

JNZ → JZ로 변경 후 새로운 실행파일로 저장

 

새로운 실행파일

이를 실행하니 처음에 떴던 창도 안뜨고,

제목에 있던 <unregistered... 도 안뜬다!

 

 

하지만 여기서 끝이 아니지

[Help]-[About]

이 부분마저 바꿔주겠다.

 

 

Search for texts 로 해당 부분을 찾아가본다.

 

 

해당 기능이 실행되는 부분이다.

아까와 같은 패턴이다.

(MOV, CMP, JNZ)

[60EB8C]에 있는 값을 EAX에 넣어주고 0과 비교한 후 ZF가 거짓이면 점프한다.

 

"JNZ" 조건이 충족되지 않아 분기가 일어나지 않고 결국 “<Unregistered.." 문자열이 나타나게 된다.

그리고 밑에는 "Licensed Version" 문자열이 나타나는 것으로 보아 

이곳으로 가줘야 한다. 

이곳을 JMP로 바꿔주었더니

 

아래와 같이 Licensed Version이라고 잘 바뀌었고, Register Key를 입력하는 부분이 사라졌다!

 

[그림1] 문제

문제에서 packing이 된 실행파일이라는 것을 알려주고 있다.

 

[그림2] 첫 실행화면

 

[그림3] 값 입력 후 뜨는 결과창

 

[그림4] PEiD로 확인한 실행파일

+) PEiD는 파일의 PE 정보로 패킹, 암호화, 컴파일에 사용된 프로그램을 찾아준다.

실행파일을 올려 확인해 보니 UPX 프로그램으로 패킹됐음을 유추할 수 있다.

 

 

<Packing & UnPacking 설명 참고>

더보기

패킹(packing)은 "실행 압축"이라고 표현할 수 있다.

실행 파일 내부에 있는 코드를 압축하여 평소에는 코드를 압축한 상태로 저장하고 있다가

파일을 실행하면 메모리에서 압축을 해제 시킨 후 파일을 실행시키는 기술이다.

 

장점

1. 파일의 크기를 줄일 수 있다.(전 후 3~4배의 차이가 있다)

2. 크래커의 리버싱으로부터 보호할 수 있다.

 


언패킹(unpacking)은 말 그대로 패킹을 푸는 것이다.

특히 UPX Compressor를 사용하는 경우는 아래의 상황이다.

- UPX 기준 설명

1. 운영체제의 Loader가 실행파일을 메모리에 올린다

2. Packing된 파일은 Unpacking Code 시작부분이 Entry Point이다.

3. EP에서 프로그램이 시작된다.

4. Packing된 파일은 Unpacking Code 영역에 들어있다.

5. Unpacking Code는 패킹된 데이터를 하나씩 읽어 압축을 풀고 Empty Space(빈 공간)에 원래 데이터를 저장한다.

6. 모든 코드가 Unpacking 되었다면 Original Entry Point(OEP)에서 프로그램이 다시 시작된다.

 

즉, OEP는 Unpacking 되기 이전 실행파일의 시작점이다

 

<UPX로 패킹된 실행파일을 unpacking 하는 방법>

1. upx 프로그램의 -d 옵션 사용

[그림5] upx 프로그램으로 unpacking 하는 과정

-d 옵션을 사용하면 패킹된 파일을 언패킹한 후 덮어 씌울 수 있다.

 

그 후 디버거에 올려서 실행하면 바로 OEP를 알 수 있다.

 

 

2. PUSHAD/POPAD 명령어 찾기

- UPX는 실행 파일 압축 프로그램으로 함수를 계속 진행하면 OEP에 도달할 수 있다.

UPX는 PUSHAD와 POPAD를 활용해 언패킹한다.

 

PUSHAD는 범용 레지스터의 값들을 스택에 저장하며, POPAD와 짝을 이루어서 사용된다.

코드의 PUSHAD가 진행되면 범용 레지스터의 값들을 EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI 순서로 스택에 저장한다.

POPAD는 스택에 저장된 레지스터 값들을 다시 레지스터에 입력한다.

보통 POPAD 밑에 점프문이 있으며 이 점프문 주소에 해당하는게 OEP인 경우가 많다.

 

① PUSHAD를 지나 마지막 레지스터 값(EDI)이 스택에 저장되었을 때,

② 그 스택부분에 BP(Break Point)를 걸면

③ POPAD에서 마지막 레지스터(EDI)를 복구시킨 후 정지된다. (스택 BP 사용시 해당 스택의 데이터가 접근 되는 시점에 브레이크가 잡히게 된다.)

④ 마지막으로 , POPAD가 끝난 후 진행되는 코드를 진행하면 원본 시작 코드로 진입할 수 있다.

 

[그림7] packing된 실행파일 처음 화면

 

[그림8] PUSHAD 작동 후 상황

각 레지스터에 값이 저장되어 있고 마지막으로 PUSH 되었던 EDI의 주소로 가 스택에 저장된 값을 확인한다.

 

[그림9] 마지막으로 PUSH 된 레지스터 값에 접근

 

[그림10] 스택에 BP 걸기

 

[그림11] [F9]키 실행 결과

이 점프문 주소(00401360)에 해당하는 게 OEP 이다.

 


문제는 OEP 뿐만이 아니라 Serial 값을 찾도록 요구하고 있다.

따라서 이 실행파일을 unpacking 한 후 다시 분석해보았다.

 

[그림12] 프로그램에 사용된 문자열들을 확인

잘못된 값을 입력했을 때 GUI 모드로 'Wrong serial!'이라는 문자열이 떴기 때문에 

프로그램에 사용된 문자열들을 확인한다.

 

[그림13] 선택한 문자열 주변 코드

'You got it' 이라는 문자열 코드가 있는 부분을 선택해 주변을 살펴보았다.

CMP 문과 JMP문이 사용된 것으로 보아 내가 입력한 값과 정답 serial 값을 비교해 

성공인지 실패인지를 가려내어 결과를 보여주는 것으로 보인다.

 

JMP문에 [F2]키를 사용해 BP를 걸고 [F9]키를 사용해 실행한다.

 

[그림14] 그러면 이러한 실행창이 뜬다.

 

[그림15] 값을 입력하고 Check Serial 버튼을 누른 결과

 

내가 입력한 값이 어디론가 PUSH 되고 있다.

아마 그 다음에 나오는 "AD46DFS547"이라는 값과 비교하여 결과가 나뉘는 것 같다.

 

따라서 정답 serial 은 "AD46DFS547" 이라고 유추 가능하다.

 

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

CodeEngn Challenge : Advance RCE L03  (0) 2021.04.28
CodeEngn Challenge : Basic RCE L09  (0) 2021.04.07
CodeEngn Challenge : Basic RCE L16  (0) 2021.03.30
CodeEngn Challenge : Basic RCE L15  (0) 2021.03.30
Reversing.kr 1번 풀이  (0) 2021.03.24

+ Recent posts