일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 악성코드분석
- 자바스크립트
- 대학생
- toVillage
- 토이프로젝트
- JS
- 사이드프로젝트
- 투빌리지
- TODOLIST
- 투두리스트
- to-do
- 악코분
- 리버싱
- 균형이진트리
- 사이버보안
- orcle
- 취업준비
- Practicalmalwareanalysis
- 다해요
- gamification
- leetcode
- N-ary Tree Preorder Traversal
- 마을짓기
- JavaScript
- 코딩테스트
- dualtable
- 릿코드
- 듀얼테이블
- lab03-03.exe
- 가차시스템
- Today
- Total
이것저것
오랜만에 쓰는, Lena tutorials 3! 본문

와 재밌다! 마참내! 내가!
왜..인지는 모르겠으나, RegisterMe.exe와 Register.Oops.exe 파일이 두개가 있어 RegisterMe.exe를 먼저 진행하겠다.
RegisterME.exe를 실행시키면 아래와 같은 팝업창이 뜬다.



nags? nags가 뭐길래 계속 지워달라고 하는거지싶어 검색을 해봤더니

예.. 뭐.. 프로그램도 잔소리 듣기 싫어하나봅니다. 하하.
농담이고, nags는 잔소리라는 의미도 있지만 귀찮게한다라는 의미에서 파생되어 팝업이라는 의미도 가지고 있다. (nag-ware, 지속적으로 팝업을 띄워 사용자를 귀찮게 하는 프로그램)
한마디로 이번 과제는 팝업창을 지우는 것이다.
평소에 하던 대로 OllyDbg를 이용해 분기점을 끊어 팝업창을 지워주자
어디서 JUMP가 되나 싶어서 STEP INTO(F8)을 진행했더니

체크해둔 두 군데서 JUMP를 하는 것이다.
첫번째 부분에서 JUMP를 하면

두번째 부분에서 JUMP를 하면

가만히 보니까.. 그럼 JUMP를 아예 안하면 된다는 생각이 들어

0040101F와 00401047을 그냥 NOP으로 바꿔서 해결했다.
이걸 ReverseMe_solved.exe라고 저장했다.
그럼 이제 Register.Oops.exe도 실행시켜보자



라고 뜨길래 이것도 분기점을 끊어주면 되겠다! 해서 OllyDbg로 실행시킬려고 했더니

그럼 그렇지...
Bad or unknown format of 32-bit executable file
에러 메세지를 해석해보면 잘못되거나 알려지지 않은 32비트 실행파일이라고 한다.
실행 파일...? 그렇다면 PE File Format과 관련있는게 아닐까?
PE File Format
Portable Executable File Format, 윈도우 운영 체제에서 사용되는 파일들을 위한 파일 형식
영어를 해석하자면 휴대하기 쉬운 즉, 이동하기 쉬운 실행할 수 있는 파일 형식을 의미한다.
이러한 PE 파일은 32비트 형태의 실행파일을 의미하여 PE32라고도 불린다.
(64비트 형태의 실행 파일은 PE+ 또는 PE32+라고 표현한다)
PE File의 종류로는
종류 | 주요 확장자 |
실행 계열 | EXE, SCR |
라이브러리 계열 | DLL, OCX, CPL, DRV |
드라이버 계열 | SYS, VXD |
오브젝트 파일 | OBJ |
가 있다.
EXE(EXEcutable) 프로그램 실행파일
DLL(Dynamic Linked Library) 동적 연결 라이브러리
PE 파일 생성 과정을 한번 살펴보자.

소스코드(Source.h)를 컴파일 하면 오브젝트 파일(Source.obj)이 생성 되고
소스코드에서 사용한 외부 함수, 외부 라이브러리(Static Link Library, Import Library)를 링크하여 실행 파일(Binary.exe)을 만든다.
이때 이 실행파일에 PE HEADER가 붙는다.
PE HEADER에는 실행 파일을 실행하기 위한 각종 정보들이 기록되어있다. 그렇기때문에 실행파일을 로딩할 때마다 해당 PE HEADER를 토대로 DLL을 가져오고, 메모리에 어떻게 적재할 것인지 필요한 STACK/HEAP 메모리의 크기를 얼마로 할건지 등 각종 리소스를 할당한다.
이번에 진행할 과제인 Lena tutorials 3번 문제 (ReverseMe.exe)를 PE viewer 로 보자.

파일에서는 RAW(offset), 메모리에서는 VA(Virtual Address)로 위치를 표현하는데
현재 VA는 알 수 없어서 그냥 비웠다.


파일이 실행되기 전 주소를 RAW(혹은 offset)이라고 한다.
이때 파일이 실행이 되었다면 그때의 메모리 주소를 RVA라고 한다.
이 파일을 실행하면 프로세스의 가상 메모리 주소 공간에 실행한 파일이 올라가는데, 그 주소를 VA라고 한다.
VA는 ImageBase을 기준으로 만들어진다. 한마디로 VA(주소) = RVA(주소) + ImageBase(주소) 다.
PE 안에는 파일을 실행하기 위한 많은 정보들이 구조체의 형태로 저장되어있다.
그 중에서 특히 3개의 구조체(헤더)를 살펴보자.
IMAGE_DOS_HEADER
IMAGE_NT_HEADER
IMAGE_SECTION_HEADER
<IMAGE_DOS_HEADER>

typeof struct _IMAGE_DOS_HEADER
{
WORD e_magic; //signature
WORD e_cblp;
WORD e_cp;
WORD e_crlc;
WORD e_cparhdr;
WORD e_minalloc;
WORD e_maxalloc;
WORD e_ss;
WORD e_sp;
WORD e_csum;
WORD e_ip;
WORD e_cs;
WORD e_lfarlc;
WORD e_ovno;
WORD e_res[4];
WORD e_oemid;
WORD e_oeminfo;
WORD e_res2[10];
LONG e_lfanew; //제일 중요한 부분
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
이때, IMAGE_DOS_HEADER의 크기는 64바이트이다. (1 WORD = 2 BYTE, 1 LONG = 4 BYTE)
구조체 멤버 변수에서 두가지를 주의깊게 봐야하는데 e_magic 과 e_lfanew이다.
e_magic : 시그니쳐 값으로 가장 처음 2 byte를 가르킨다. PE 파일 포맷임을 알려줌(MZ)
e_lfanew : IMAGE_NT_HEADER의 위치를 알려줌

따라서, 000000C0로 이동해야한다.
<IMAGE_NT_HEADER>

typedef struct _IMAGE_NT_HEARDS
{
DWORD; //signature, 바이러스 제작자들이 자신의 값을 표시하는데 활용, 50 45 00 00
IMAGE_FILE_HEADER; //file header
IMAGE_OPTINAL_HEADER; //optinal header
} IMAGE_NT_HEADER, *PIMAGE_NT_HEADER;
IMAGE_NT_HEADER 파일에 속해있는 구조체를 하나씩 보면
typedef struct _IMAGE_FILE_HEADER
{
WORD Machine; //어떤 CPU에서 이 파일이 실행될 수 있는지
WORD NumberOfSections; //.text .data 같은 코드 섹션과 데이터 섹션이 몇개 있는 지 알려줌
//일반적으론 .text .rdata .data .rsrc 4개
DWORD TimeDateStamp; //obj파일이 컴파일러를 통해 EXE로 생성한 시간
DWORD PointerToSymbolTable;
DWORD NumerOfSymbols;
WORD SizeOfOptionalHeader; //IMAGE_OPTIONAL HEADER의 크기
//운영체제마다 주소의 길이가 달라 크기도 달라질 수 있음
WORD Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
typedef struct _IMAGE_OPTIONAL_HEADER
{
WORD Magic; //32비트 실행파일의 경우 0x10B, 64비트 실행 파일의 경우 0x20B
BYTE MajorLinkerVersion; //어떤 버전의 컴퍼일러로 빌드했는지.
BYTE MinorLinkerVersion; //어떤 버전의 컴퍼일러로 빌드했는지.
DWORD SizeOfCode; //코드섹션의 크기, 코드 양의 전체 크기를 가르킴
//바이러스나 악성코드는 이 필드를 읽어서 자신의 코드를 복제할 위치를 기준 잡기도 하고
//보안 솔루션에서는 코드 섹션의 무결성 검사를 수행할 때 이 섹션의 값을 얻어와서 검사 크기를 잡음
DWORD SizeOfInitializedData;
DWORD SizeOfUninitializedData;
DWORD AddressOfEntryPoint; //실제 파일이 메모리에서 실행되는 시작 지점
//점프하는 코드가 있는 곳
DWORD BaseOfCode; //첫 번째 코드 섹션이 시작되는 RVA를 의미
DWORD BaseOfData;
DWORD ImageBase; //해당 파일이 실행될 경우, 실제 가장 메모리에 올라가는 번지를 가르킴
//EXE 파일의 경우 특별한 번지 지정 옵션이 없는 한 대부분 0x00400000
DWORD SectionAlignment; //각 섹션을 정렬하기 위한 저장 단위
DWORD FileAlignment; //파일 상의 간격을 의미
WORD MajorOperatingSystemVersion;
WORD MinorOperatingSystemVersion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsystemVersion;
WORD MinorSubsystemVersion;
DWORD Win32VersionValue;
DWORD SizeOfImage; // EXE DLL이 메모리에 로딩됐을 때의 전체 크기
//SectionAlignment의 배수
DWORD SizeOfHeaders; //PE 헤더의 크기를 알려주는 필드
//FileAlignment의 배수
DWORD CheckSum;
WORD Subsystem;
WORD DllCharacteristics;
DWORD SizeOfStackReserve;
DWORD SizeOfStackCommit;
DWORD SizeOfHeapReserve;
DWORD SizeOfHeapCommit;
DWORD LoaderFlags;
DWORD NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; //각 디렉토리의 가상 주소와 크기에 대한 정보를 담고 있음
//IMAGE_NUMBEROF_DIRECTORY_ENTRIES는 16으로 정의되어있음
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
그 중에서 특히 AddressOfEntryPoint 와 BaseOfCode 그리고 ImageBase를 유심히 봐야할 거 같다는 느낌이 들었다.
분기점과 시작 주소를 알아낸 다음, ImageBase를 가지고 주소를 계산 [VA(주소) = RVA(주소) + ImageBase(주소)]해야 원하는 위치에 접근할 수 있겠다라는 생각이 들었기 때문이다.
<IMAGE_SECTION_HEADER>

비슷한 SECTION의 속성을 정의해 한군데로 모아둔 것이 SECTION HEADER 이다.
앞에서 봤던 사진을 다시 한번 더 살펴보자

이 헤더를 참고해서 NT_HEADER 안에서 정의된 IMAGE_FILE_HEADER와 IMAGE_OPTIONAL_HEADER의 내용이 채워지는 것이다. (각 구조체의 변수 확인)
그렇기 때문에 SECTION.txt IMPORT Directory를 보면 IAT를 확인할 수 있고, 이것을 토대로 라이브러리, 함수의 주소를 가져와 프로그램이 실행되는 것이다.
IAT에 대한 내용은 아래 포스터에서 확인할 수 있다.
https://k-clutter.tistory.com/75?category=1090526
이제 RegisterMe.exe와 Register.Oops.exe를 PE viewer 로 비교해보자.
어떻게 되어있길래 Register.Oops.exe 정상 PE 파일이 아닐까?

ReverseMe.Oops.exe에서는 IMAGE_NT_HEADERS의 IMAGE_OPTIONAL_HEADER와 IMAGE_SECTION_HEADER가 없다는 것을 알 수 있다.
그렇기 때문에 IMAGE_OPTIONAL_HEADER가 없으면 AddressOfEntryPoint, BaseOfCode 그리고 ImageBase의 대한 정보를 알 수가 없다.
ReverMe.exe에선 분기점을 끊어내 팝업창의 주소에 접근하지 못하도록 했는데 어떻게 하면 좋을까?
잘못된 PE 파일의 구조가 정확하게 어떻게 되어있는진 모르겠지만, 위에서 해결한 ReverseME.exe(ReverseMe_solved.exe) 의 데이터 내용과 동일하게 만들어주면 자연스럽게 분기점이 다 끊기는게 아닐까?
Viewer 로는 정보를 편집할 수 있는게 아니여서, (OllyDbg로도 편집이 불가능)
ReverseMe.Oops.exe를 편집할 수 있는 툴을 찾았다.
https://mh-nexus.de/en/hxd/
HxD - Freeware Hex Editor and Disk Editor | mh-nexus
HxD - Freeware Hex Editor and Disk Editor HxD is a carefully designed and fast hex editor which, additionally to raw disk editing and modifying of main memory (RAM), handles files of any size. The easy to use interface offers features such as searching and
mh-nexus.de

ReverseMe.Oops.exe의 000000DF의 40이라고 되어있는 부분을 ReverseMe.exe의 000000DF의 값과 동일하게 00으로 수정해주었다.
모든 다른 부분을 이제 싹 다 수정하자

수정한 위치는 다음 사진과 같다.



해결했다.
출처
https://ko.wikipedia.org/wiki/PE_%ED%8F%AC%EB%A7%B7
PE 포맷 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. Portable Executable파일 확장자.acm, .ax, .cpl, .dll, .drv, .efi, .exe, .mui, .ocx, .scr, .sys, .tsp인터넷 미디어 타입 application/vnd.microsoft.portable-executable[1]개발현재 마이크로소프
ko.wikipedia.org
PE(Portable Executable) File Format (1) - PE Header
Introduction Windows 운영체제의 PE(Portable Executable) File Format 에 대해서 아주 상세히 공부해 보도록 하겠습니다. PE format 을 공부하면서 Windows 운영체제의 가장 핵심적인 부분인 Process, Memory, D..
reversecore.com
https://ko.wikipedia.org/wiki/%EB%82%B4%EA%B7%B8%EC%9B%A8%EC%96%B4
내그웨어 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전.
ko.wikipedia.org
https://learn.microsoft.com/en-us/windows/win32/debug/pe-format
PE Format - Win32 apps
This specification describes the structure of executable (image) files and object files under the Windows family of operating systems. These files are referred to as Portable Executable (PE) and Common Object File Format (COFF) files, respectively.
learn.microsoft.com
Inside Windows: Win32 Portable Executable File Format in Detail
long time ago, in a galaxy far away, I wrote one of my first articles for Microsoft Systems Journal (now MSDN® Magazine). The article, "Peering Inside the PE: A Tour of the Win32 Portable Executable File Format," turned out to be more popular than I had e
learn.microsoft.com
https://haker.tistory.com/18?category=943258
7. PE 헤더(1) - PE 헤더란?
PE 헤더 PE란 Portable Executable File Format의 약자다. 우리가 만든 이 파일(File)을 실행할 수 있는, 이식 가능한 다른 곳에 옮겨져도(Portable) 실행이 가능하도록 (Executable) 만들어놓은 포맷(Format) PE..
haker.tistory.com
https://foxtrotin.tistory.com/330
VA, RVA, RAW 개념
RVA RVA: ImageBase로부터의 상대주소 (메모리에 로딩된 상태) 특정한 위치로부터 얼마만큼 떨어진 곳에 위치하는지 알려주는 주소 ImageBase는 NT Header중에서 IMAGE_OPTIONAL_HEADER32 구조체 안에 있으며, 메.
foxtrotin.tistory.com
'전공 > 악성코드분석' 카테고리의 다른 글
기초동적분석 Lab03-03.exe (1) | 2022.11.15 |
---|---|
기초정적분석하기, Lab 01-02.exe (0) | 2022.11.06 |
IAT 총정리 (0) | 2022.10.04 |
lena tutorials 2, JUMP로 해결하기 (0) | 2022.09.27 |
과제 1주차 abex crackme 2 (0) | 2022.09.18 |