본문 바로가기

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

[2021.03.27] CodeEngn Basic L08~L10 & 교재 3장

[Codeengn basic 8~10 풀이]

1.CodeEngn Basic RCE L08

#8 OEP를 구하시오 Ex)00400000

 

처음 실행 시 뜨는 화면

 

계산기인듯? 1+1 이런 연산들 계산 된다.

OEP란? Original Entry Point : 패킹된 파일의 실제 프로그램 시작 부분

OEP 이전의 실행 부분은 패킹된 파일이 메모리에 로드되어 압축을 푸는 명령어가 들어 있음!

이게 그럼 압축되어있다는 소린가?

 

방법 1)

패킹하기 전 파일의 OEP : 01020C40

압축풀기 (55 -> 112 KB 변화)

 

패킹 후 OEP

01012475

 

어라라… 이게 답이네..?

 

방법 2)

맨처음 켠 곳의 맨 마지막 코드에 BP 걸고 내부로 들어가면

바로 처음이 OEP!

 

2. CodeEngn Basic RCE L09

codeengn Basic RCE L09 - StolenByte를 구하시오 Ex) 75156A0068352040

*stolen byte

훔쳐진 바이트란 의미로 프로그램의 한 부분의 코드를 훔쳐내어 다른 부분으로 옮겨진 코드를 의미한다. 주로 옮겨지는 코드는 EP 위 몇 개의 코드들이며 옮겨진 코드들은 OEP 주소로 점프하기 전 위치에서 PUSH 되어진다. 이 부분의 명령어들은 이동된 곳 또는 할당받은 메모리 공간에서 실행되어진다. 만일, 보호된 프로세스의 메모리가 덤프 되었을 때 Stolen byte를 복구하지 못한다면 덤프된 실행파일은 정상적으로 작동하지 않는다.

POPAD와 jmp OEP 사이에 연속되어진 PUSH 부분을 Stolen Bytes라고 한다.

 

프로그램을 실행시켜 보면, 위와 같은 메시지 창이 뜬다. 키 파일을 찾지 못했다고 한다.

디버거로 열어 파일을 보니, EP에 PUSHAD 명령어를 확인할 수 있다. 패킹 되어 있을 확률이 크니 확인해본다.

 

Exeinfo PE로 확인해본 결과, UPX로 패킹 되어 있는 것을 확인할 수 있었다.

UPX를 이용해 언패킹 해준다.

 

언패킹한 파일을 실행시켜보면, 문구가 제대로 출력되지 않는다. 언패킹 과정 중에 Stolen byte가 생긴 것을 추측할 수 있다.

언패킹 된 프로그램을 디버거로 열어보면 코드가 뭔가 이상함을 느낄 수 있다. entrypoint 부분이 nop으로 채워져있다. 메세지박스를 출력하는 함수는 있는데, 인자로 전달된 값, 즉 출력할 값이 전혀 없다. 이 부분이 아마 StolenByte인 것 같다.

StolenByte는 코드를 훔쳐, 다른 위치로 옮겨 놓은 것이다. 그렇다면 원래 NOP 자리에 있었어야 할 값들은 어디로 간 것일까? 답은 패킹이 된 프로그램 속에 있다. 언패킹 하기 전 패킹된 프로그램을 디버거로 열어본다.

StolenByte는 OEP 주소로 이동하기 전에 PUSH가 되므로 OEP 주소로 이동하기 전 위치로 가서 확인해본다.

OEP 주소로 이동하는 점프문 위에 3개의 PUSH문을 확인할 수 있다.

프로그램을 원래 실행했을 때 나타나야하는 메시지들인 것 같다.

nop으로 채워진 곳을 stolenbyte로 채워본다.

 

 

원래 이렇게 실행되던 것이

 

이렇게 실행이 잘 된다.

정답은 6A0068002040006812204000

3. CodeEngn Basic RCE L10

#10 OEP+ OPCODE 구하시오

 

실행시 화면: 아무거나 눌러도 입력X

 

평소엔 UPX 패킹인데, 얘는 ASPack, 즉 패킹된 것

 

언패킹 원리

PUSHAD 명령어를 통해 

레지스터를 스택에 쌓는다.

정상 코드 

메모리에 복구

POPAD 명령어를 통해 

레지스터값들을 복구

OEP로 분기

출처: https://stih.tistory.com/68 [STIH]

 

실행: PUSHAD로 시작하는 것을 확인할 수 있다. PUSHAD로 시작하는 것은 aspack으로 패킹된 파일의 특징이다.

 

우클릭 - Follow in Dump

우클릭 - Breakpoint - Hardware, on access - Dword

F9 누르면 아래랑 같다.(f9로 실행해주면 JNZ~부분으로 이동하게 된다. 상단의 POPAD가 있다.)

여기서 ctrl F7

 

RETN으로 들어가면 아래와 같은 화면 뜸

   = 올리 디버거가 분석을 하지 못했을 때 나타나는 화면

여기서 ctrl+A를 눌러주면 언패킹이 완료

언패킹이 완료되었다. OEP는 00445834

 

문젤 다시 보면, (이제 두 번째 문제인 등록 성공으로 가는 분기점의 OPCODE를 찾아야 한다.)

Search for - All referenced text strings - Registered … well done!

 

 

여기서 OPCODE를 찾아야함. OPCODE는 명령어를 뜻함.

즉 성공, 실패 가르는 분기점에서 쓰인 명령을 찾아야한다.

-> 주변을 살핀다!  : JNZ는 ZF가 0이 아닐때 점프함. 일종의 분기점

따라서 분기점의 opcode는 7555

답: OEP + OPCODE = 004458347555



 [리버싱 이 정도는 알아야지] #3장. Windows 리버싱 | 기능 분석

 

목적: 실제 리버싱은 컴파일된 파일을 분석하는 작업이므로 코드 구성이 어떻게 되는지 알 수 없다. 특정 기능을 수행하기 위해서 어떤 코드가 사용되는지 알면 보다 더 정확한 분석이 가능하다. 

 

 * Win32 API로 코드 작성 후 분석 (Sample 05.exe)

동작 확인: Sample 05.exe – 같은 경로에 있는 Sample 01.exe를 삭제하고 “%Temp%” 경로에 Replicated Sample 01.exe 생성 후 해당 파일 실행

 

1.파일 복제 코드 기본 구성

•복제 파일을 만들기 위해서는 Sample 01.exe 파일 데이터가 필요함

•필요한 API: CreateFile() // 파일을 새로 만들거나 기존 파일을 열 수 있음

 

 

리버싱 이 정도는 알아야지

#3-3 레지스트리 ~

 

☞ 일종의 데이터 베이스로 Windows 시스템 정보와 함께 동작에 필요한 다양한 정보들이 기록되어 있음

통상적인 정의 : 마이크로소프트 윈도우 운영체제에서 운영체제와 응용프로그램 운영에 필요한 정보를 저장하기 위해 고안한 계층형 데이터베이스

부팅 과정부터 로그인, 서비스 실행, 응용프로그램 실행, 사용자 행위 등 모든 활동에 관여함

 

☞ 악성코드뿐만 아니라 포렌식 관점에서도 중요

운영체제 정보, 사용자 계정 정보, 시스템 정보, 응용프로그램 실행 흔적, 최근 접근 문서 등

자동 실행 항목 분석, 악성코드 탐지

저장매체 사용 흔적 분석(하드디스크, CD-ROM, USB 등)

((왜 포렌식 관점에서도 중요하다는지 아시겠죠?))

 

 

 

 

# 몇 가지 요약

    레지스트리 구조

Root Key

Key

Key

Value

Value

Value

Value

Data

Data

Data

Data

Data

Data

Data

Data

               

 

 

 

    루트키 구성 정보

루트키

약어

설명

HKEY_CLASSES_ROOT

HKCR

파일 확장자와 확장자가 사용할 프로그램의 매핑 정보가 정의되어 있다.

HKEY_CURRENT_USER

HKCU

현재 시스템이 로그온하고 있는 사용자가 설정한 시스템 환경 정보(네트워크, 응용 프로그램 등의 정보)가 정의되어 있다.

HKEY_LOCAL_MACHINE

HKLM

시스템의 하드웨어 구성에 필요한 초기화 파일과 소프트웨어 정보, 드라이버 정보 등이 정의되어 있다.

HKEY_USERS

HKU

시스템에 있는 모든 계정과 그룹에 대한 시스템 환경 정보가 정의되어 있다.

HKEY_CURRENT_CONFIG

HKCC

시스템이 부팅 시 사용하는 하드웨어 프로파일 정보(글꼴, 프린터 정보 등의 부가적 정보)가 정의되어 있다.

HKEY_PERFORMANCE_DATA

HKPD

성능 카운트 (레지스트리 편집기로 접근 불가, 레지스트리 함수로만 접근)

 

 

 

 

    시스템 동작에 필요한 다양한 정보들이 레지스트리에 기록되어 있다!

    레지스트리의 Value를 등록, 조회, 수정하기 위해서는 Key를 열어줘야 한다!

    RegEnumValue( ) : Value를 조회할 때 사용하는 API

    RegSetValueEx( ) : 지정된 값의 데이터 및 유형을 설정 (내가 찾고자하는 그 파일이 맞는지)

    CMD – shutdown : 재부팅

 

 

 

# 103쪽~ 의 예제 따라가보기

 

원래 여기 익스플로러 인터넷 옵션에서 하는데, 우리는 레지스트리를 배웠으므로 다르게 바꿔본다.

 

HKCU\Software\Microsoft\Internet Explorer\Main

 

HKCU? HKey_Current_User

HKU 아래에 설정된 현재 로그인한 상태인 사용자의 하위 키를 가리키는 링크

윈도우가 설치된 컴퓨터 환경설정 정보

 

레지스트리 편집기 (Registry Editor)실행

 

 이렇게 쭉쭉쭉 골라서 들어가면~

이 화살표 부분 링크를 네이버 도메인으로 바꾸면 메인이 바뀝니다.

 

 

 

마지막으로 팀원들이 알면 좋을 것 같아 추가한 내용 >_@

# 하이브 파일 (Hive File)

레지스트리 정보를 저장하고 있는 물리적인 파일

키 값들이 논리적인 구조로 저장되어 있음

활성시스템의 커널에서 하이브 파일을 관리함. (즉, 레지스트리 탐색기에선 접근 불가)

 

왜 필요할까?

레지스트리는 메모리에 있다. 즉, 휘발성!

컴퓨터가 꺼지면 사라진다. 만약 껐다 켰을 경우(재부팅), 레지스트리 관련 정보를 빠르게 확인하기 어려우므로, 레지스트리의 주요 정보는 하이브 파일에 저장하여 관리하는 것이다.

하이브 파일의 저장 위치는 물리적인 파일 >> 즉, 비휘발성