본문 바로가기

2. Reversing (리버싱)/1) Write UP

[2021.03.20] CodeEngn Basic L05-L07 & 교재 Chapter2 발표

<CodeEngn Basic L05-L07>

 

#5 이 프로그램의 등록키는 무엇인가

우선 처음 프로그램을 실행하면 이렇게 나온다.

 

 

 

05.exe 실행 화면

처음에 갈피를 못잡다가, 다른 사람들 풀이를 보니 언패킹이라는 것을 해야한다고 함! 언패킹도구인 upx 사용 (깃에서 다운받고 환경변수 설정하고 실행)

 

언패킹도구인 upx 사용
시작점 (OEP)

언패킹하면 용량도 더 커지고 시작지점도 달라진다.

 

한 줄씩 실행해보면

BP

요기서 실행됨. bp달고 코드 속에 들어가서 현재 모듈의 문자열 찾기를 해본다.

앞뒤 성공 실패 메세지 사이에 끼인 수상한 메세지 발견

정답코드로 추정되는 것

실제로 문제를 풀어보면, 저게 정답 코드가 맞음을 알 수 있다!

 

<공부하면서 깨달은 알면 괜찮은 참고사항>

패킹을 하는 이유 : 악성 행위로부터 자신을 보호하기 위해

단순히 실행파일의 크기를 줄이기 위해 압축하는 컴프레싱과는 다르게,

패킹은 프로그램 분석을 어렵게 만들기 위한 목적을 가지고 있다. (Protecting)

          >> 프로그램이 분석되어 악의적으로 동작한다면 보안 사고를 초래할 수 있기 때문에 이 분석 자체를 어렵게 하는 것!

프로그램의 원본 실행 코드를 암호화하여 저장하고 이를 복호화하는 코드를 프로그램에 포함하는 방식으로 구현..

근데 그 개념은 모호해서, 도구인 upx 사용함.

 

/* OEP : (언패킹 후)원본 실행 코드의 진입점

패킹된 프로그램의 실행 코드는 실행 시점에 복호화되어 동작을 수행함. (조금 느릴 수 있다, 하지만 보안성이 있으니 감수할만함)

프로그램에 포함된 복호화 코드가 프로그램의 진입점 (프로그램이 메모리에 로드된 후 복호화 코드로 원본 실행 코드를 복호화, 메모리의 어느 공간에 저장하여 실행할건지 구성 */

 

 

#6. Unpack을 한 후 Serial을 찾으시오

 

어떤 패커로 패킹되었는지 확인 (with PEiD) -> UPX로 패킹되어 있는 것을 확인함

 

언패킹 완료

 

 

OllyDBG에 언패킹한 내용을 올림

 

내리다보면, 이런 문구들이 보인다.

 

Back to user mode:  어떤 이벤트를 처리하고 난 바로 직후의 상태로 디버거를 옮김.

여기에선 에러창에서 Back to User 모드 사용 -> 에러창 구성하는 문자열, 메시지 띄우는 창 등을 확인할 수 있다 .F9 누르면 아래와 같은 화면이 뜬다.

위의 상태에서 중지 누른다.

 

Alt + F9를 누르면 Paused에서 Back to user 로 바뀐다.

아까 띄워놓은 에러메시지 확인클릭을 하면 -> 이벤트가 발생한 코드로 이동

이제, 약간만 올리면 답(=시리얼 키)이 보임

시리얼은 찾았는데 OEP도 구하랬음 -> 화면에 보이는 00401360 이라는 숫자.

 

 

#7. 컴퓨터 C 드라이브의 이름이 CodeEngn 일경우 시리얼이 생성될때 CodeEngn은 'ß어떤것'으로 변경되는가

 

 

 exe파일 실행 시 시리얼을 입력하라는 창이 나오고 아무거나 입력을 하면 ‘The serial you entered is not correct!’라는 오류메세지가 뜬다.

 

올리디버거에 올려 search for로 해당 오류메세지의 string 값을 찾아보면 아래와 같은 그림이 나온다.

 

 

오류메세지 이전에 의심될만한 문자열인 ‘L2C-57816784-ABEX’가 보이고, 실행 시 입력했던 123과 비교하고 있으므로 해당 문자열이 시리얼 값이라고 추측할 수 있다.

 

시리얼 값이 맞다고 나오고, 문제에서 구하라고 한 것은 C드라이브 값이 Codeengn일 경우의 값이다. c드라이브의 이름을 codeengn으로 바꾸면 드라이브 관련 함수에 의해 드라이브의 이름 값이 얻어지고,  IstrcatA 함수에 의해 두 문자열이 합치면서 c드라이브 이름인 codeengn의 값이 바뀌게 된다.

 

 

<교재 리버싱 이 정도는 알아야지 Chapter 02>

1. PE FILE 개념 + 구성

PE FILE: Microsoft에서 정한 실행파일 형식

-> Window OS에서 동작하는 모든 프로그램 -> PE File Format 적용

PE File Format 정리하는 의미로, 직접 실행파일 만들어본다. Hex Editor로 정보를 채우고, OllyDBG에 올린 Sample01.exe 파일에서 소리내는 기능을 가져온다. 보정을 하고, Safe file이라는 기능을 사용해서 저장하면 PE파일이 만들어진다.

 

2. OllyDBG 화면 구성 + 레지스터 구성

 

레지스터의 모습은 위와 같다. 범용 레지스터, 명령 포인터 레지스터, 세그먼트 레지스터, 플래그 레지스터가 있다. 가장 중요한 것은 범용 레지스터인데, 주 용도가 정해져있는 레지스터가 있다. EAX, ECX, ESI, EDI, ESP, EBP이다. 각각에 대한 내용은 아래와 같다.

 

3. Assembly와 친해지기

-       sample_02.exe 실행파일의 코드는 if문을 통해 systemdate가 2005년이고, 0월이며, 32일이며 “if code!!”를 출력하는 것으로 구성되어 있다.

-       0월이 될 수 없기 때문에 올리디버거에서 어셈블리어 자체를 수정해 주어야 한

다.

-       JNZ – ZF 레지스터 값이 0일 때 점프 명령 수행

-       JE – ZF 레지스터 값이 1일 때 점프 명령 수행

-       그림과 같이 jnz와 je는 반대 명령이므로 바꾸어주면 if code가 출력된다.

 

 

4. 실행압축

-       PE 파일이 실행 가능하도록 압축된 형태

-       일반 파일 압축과는 다름, 실행가능한 압축 형태임. “Packing”이라고 칭한다.

 

- 위 그림은 패킹/언패킹 시 실행파일의 구조이다. UPX1 섹션에 압축 해제 코드가 기록되어 있고, 압축 해제 과정이 끝나면 UPX0에 있는 OEP코드로 이동하며 본래 기능을 수행한다.

 

<언패킹 과정>

  1. 압축 해제 후 메모리에 기록한다.
  2. 압축 해제가 완료되면 call이나 jmp 주소를 복원한다.
  3. IAT를 복구한다.
  4. OEP로 이동한다.

 

위 방법보다 더 쉽게 OEP를 찾는 방법은 PUSHAD와 POPAD를 이용하는 것이다. 명령 검색을 통해 POPAD를 찾고, 그 밑으로 보이는 JMP와 CALL 명령을 유의하여 보면 OEP주소를 가리키는 명령이 존재한다.