Reverse Engineering 8

Exercise: Helloworld

이번 코스에서는 간단한 예제인 HelloWorld.exe을 분석해보는 실습을 할 것이다. 예제는 1초를 대기하고 Hello, world!를 출력하는 프로그램이다. /* File: hello-world.cpp Build opts: - /MT -> Library Static Linking - /DYNAMICBASE:NO -> Disable ASLR - /od -> Disable Optimization */ #include #include char* str; int main() { int delay = 1000; Sleep(delay); // 1000ms(1초)를 대기합니다. str = (char*)"Hello, world!\\n"; printf(str); return 0; } 정적 분석 신뢰할 수 없는 프로..

Reverse Engineering 2023.07.02

Tools: IDA

The Interactive Disassembler (IDA)는 Hex-Rays 사에서 제작한 디스어셈블러이다. IDA의 메인 기능은 디스어셈블이지만 이 외에도 여러 환경에서의 디버깅과 다양한 아키텍처 디컴파일과 같이 여러가지 기능을 제공한다. 이 때문에 바이너리를 분석해야 하는 리버스 엔지니어링 업무에는 대다수 IDA를 이용한다. IDA Pro는 대략 천만원에서 이천만원 사이의 금액대를 가지지만 Hex-Rays 사는 IDA Freeware를 제공한다. IDA Freeware는 x64 아키텍처에 한해 디컴파일 기능을 지원하며, 상업적 목적 이외의 교육적 목적으로는 이용 가능하다. IDA 설치 IDA Freeware는 https://hex-rays.com/ida-free/ 에서 다운로드할 수 있다. 파일 ..

Reverse Engineering 2023.07.02

x86 Assembly: Essential Part(1)

컴퓨터 과학자 중 한 명인 David Wheeler는 EDSAC을 개발하면서 어셈블리 언어와 어셈블러라는 것을 고안했다.소프트웨어를 역분석하는 사람들은 역발상을 더해, 기계어를 어셈블리 언어로 번역하는 역어셈블러를 개발했다. x86-64 어셈블리 언어기본 구조x64 어셈블리 언어는 우리가 사용하는 한국어보다는 훨씬 단순한 문법 구조를 지닌다.이들의 문장은 동사에 해당하는 명령어(Operation Code, Opcode)와 목적어에 해당하는 피연산자(Operand)로 구성된다. 명령어인텔의 x64에는 매우 많은 명령어가 존재한다.이 중 중요한 21개의 명령어는 다음과 같다.명령 코드데이터 이동(Data Transfer)mov, lea산술 연산(Arithmetic)inc, dec, add, sub논리 연산(..

Reverse Engineering 2023.07.02

Background: Windows Memory Layout

메모리 레이아웃(Memory Layout)이란 프로세스 가상 메모리(Virtual Memory)의 구성을 말한다. 프로그램을 실행하면 운영체제는 프로세스에게 사용 가능한 메모리 공간을 할당해 준다. 컴퓨터 과학에서는 이 공간을 가상 메모리라고 부른다. 운영체제는 프로그램의 정보를 참조하여 프로그램에 저장된 데이터가 적절한 영역에 저장되게 한다. 프로세스 메모리 구조 섹션 윈도우의 PE 파일은 PE 헤더와 1개 이상의 섹션으로 구성되어 있다. 여기서 섹션이란, 유사한 용도로 사용되는 데이터가 모여있는 영역이다. 섹션에 대한 정보는 PE 헤더에 적혀있다. PE 헤더에 저장되는 섹션과 관련된 데이터 중, 중요한 것은 다음과 같다. 섹션의 이름 섹션의 크기 섹션이 로드될 주소의 오프셋 섹션의 속성과 권한 윈도우..

Reverse Engineering 2023.07.02

Background: Computer Architecture

서도 다른 부품들이 모여서 ‘컴퓨터’라는 하나의 기계로서 동작할 수 있는 것은 컴퓨터에 대한 기본 설계가 존재하기 때문이다. 컴퓨터 과학에서는 이러한 설계를 ‘컴퓨터 구조(Computer Architecture)’라고 부른다.전체적인 컴퓨터 구조 중에서 특히 CPU가 사용하는 명령어와 관련된 설계를 명령어 집합구조(Instruction Set Architecture, ISA)라고 하는데, 가장 널리 사용되는 ISA 중 하나가 인텔의 x86-64 아키텍처이다.💡컴퓨터 과학을 배워야 하는 이유리버스 엔지니어링의 기술은 컴퓨터 과학에 뿌리를 두고 있다. 따라서 숙련된 리버스 엔지니어가 되기 위해선 단순히 알려진 기술을 습득하는 것에 그치지 않고 바탕이 되는 컴퓨터 과학을 이해하기 위해 노력해야 한다. 컴퓨터 ..

Reverse Engineering 2023.07.02

Static Analysis vs. Dynamic Analysis

리버스 엔지니어링에서는 소프트웨어를 분석하기 위해 사용하는 분석 방법들을 크게 정적 분석과 동적 분석으로 구분한다. 정적 분석은 외적인 관찰만을 통해 정보를 알아내는 것을 의미하며, 동적 분석은 실행을 통해 동작을 분석하는 것을 의미한다. 정적 분석과 동적 분석 중 한 방법만을 고수하는 것이 아니라 상황에 따라 적절한 방법을 선택하는 것이 리버싱 실력을 좌우하는 중요한 요소이다. 정적 분석 정적 분석은 프로그램을 실행시키지 않고 분석하는 방법이다. 정적 분석의 장점 정적 분석을 사용하면 프로그램의 전체 구조를 파악하기 쉽다. 정적 분석 도구들은 프로그램의 여러 정보를 살펴볼 수 있도록 도움을 주는데, 프로그램이 어떤 함수로 구성됐고 함수들은 서로 어떤 호출 관계를 갖는지, 어떤 API를 사용하고 어떤 문..

Reverse Engineering 2023.07.02

Background: Binary

프로그램 프로그램은 연산 장치가 수행해야 하는 동작을 정의한 일종의 문서이다. 과거에는 프로그램을 애니악(ENIAC) 컴퓨터를 사용하며, 프로그램이 바뀔 때마다 배선을 재배치해야 했으므로 매우 비효율적이었고, 크기가 큰 프로그램을 사용하기도 어려웠다. 이런 단점을 해결한 Stored-Program Computer가 1950년경에 최초로 상용화 되었다. 소프트웨어 개발자, 해커 등 많은 정보 분야의 엔지니어들이 프로그램을 **바이너리(Binary)**라고 부르곤 하는데, 이는 Stored-Program Computer에서 프로그램이 저장 장치에 이진(Binary) 형태로 저장되기 때문이다. 텍스트가 아닌 다른 데이터들도 바이너리라고 불리긴 하지만, 많은 경우에 바이너리라고 하면 프로그램을 의미한다. 컴파일..

Reverse Engineering 2023.07.02