- [ Dreamhack/Reverse Engineering ]Exercise: Helloworld2025-03-24 20:31:2700. 서론이번 강의에서는 간단한 예제인 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(..
- [ Dreamhack/Reverse Engineering ]Quiz: x86 Assembly 22025-03-23 04:02:56Q1.end로 점프하면 프로그램이 종료된다고 가정하자. 프로그램이 종료됐을 때, 0x400000부터 0x400019까지의 데이터를 대응되는 아스키 문자로 변환하면 어느 문자열이 나오는가?[Register]rcx = 0rdx = 0rsi = 0x400000=======================[Memory]0x400000 | 0x67 0x55 0x5c 0x53 0x5f 0x5d 0x55 0x100x400008 | 0x44 0x5f 0x10 0x51 0x43 0x43 0x55 0x5d0x400010 | 0x52 0x5c 0x49 0x10 0x47 0x5f 0x42 0x5c0x400018 | 0x54 0x11 0x00 0x00 0x00 0x00 0x00 0x00=======================[c..
- [ Dreamhack/Reverse Engineering ]Quiz: x86 Assembly 12025-03-23 02:32:30Q1.레지스터, 메모리 및 코드가 다음과 같다. Code를 1까지 실행했을 때, rax에 저장된 값은?[Register]rbx = 0x401A40=================================[Memory]0x401a40 | 0x00000000123456780x401a48 | 0x0000000000C0FFEE0x401a50 | 0x00000000DEADBEEF0x401a58 | 0x00000000CAFEBABE0x401a60 | 0x0000000087654321=================================[Code]1: mov rax, [rbx+8]2: lea rax, [rbx+8] 내 풀이) - 정답rbx는 메모리 주소를 저장하기 위해 사용되는 (범용)레지스터이다. 코드의 1..
- [ Dreamhack/Reverse Engineering ]x86 Assembly: Essential Part(2) [★]2025-03-23 01:30:1700. 서론지난 코스에서는 산술연산, 논리연산, 비교(cmp, test), 분기(jmp, je, jg)의 어셈블리 명령어를 배웠다. 이번 코스에서는 OS의 핵심 자료구조인 스택, C언어의 함수에 대응되는 프로시저와 관련된 어셈블리 명령어를 공부할 것이다.스택: push, pop프로시저: call, leave, ret01. x86-64 어셈블리 명령어 pt.201.1. 스택 구조스택은 하향 성장한다. 즉, 메모리를 사용할 수록 밑으로 자란다스택은 top이 아래쪽에 있고, bottom이 위쪽에 있다.rsp라는 특수한 레지스터가 스택의 맨 아래 주소(top 원소)를 가리키고 있음 01.2. Opcode: 스택 push ★★push val = 현재 스택의 최상단(top)에 val의 값을 저장하는 연산스택은 밑..
- [ Dreamhack/Reverse Engineering ]x86 Assembly: Essential Part(1)2025-03-22 18:32:4700. 서론 - 리버스 엔지니어의 언어: 어셈블리컴퓨터 속에는 하나의 거대한 세계가 있다. 복잡한 논리적 인과관계가 존재하고, 여러 개체가 상호작용하며, 그 세계에서 통용되는 기계어라는 언어가 있다. 그리고 리버스 엔지니어가 하는 일은 그 거대한 세계의 동작을 이해하는 것이다. 이를 위해 리버스 엔지니어가 갖춰야하는 기본 소양 중 하나는 컴퓨터의 언어를 이해하는 것이다. 커리큘럼에서 다루는 x86-64를 비롯하여 대중적으로 많이 사용되는 아키텍처들은 인터넷에서 역어셈블러를 구하기 매우 쉽다. 따라서 우리가 어셈블리어만 이해할 수 있다면 역어셈블러를 사용하여 소프트웨어를 분석해 볼 수 있다.이 커리큘럼에서는 앞으로 두 코스에 걸쳐 어셈블리 언어에 대해 개략적인 설명을 하고, x86-64의 명령어들을 소개할..
- [ Dreamhack/Reverse Engineering ]Background: Windows Memory Layout2025-03-18 20:46:4901. 서론 ★메모리 레이아웃(Memory Layout)이란 프로세스 가상 메모리(Virtual Memory)의 구성을 말한다. 프로그램을 실행하면 운영체제는 프로세스에게 사용 가능한 메모리 공간을 할당해 준다. 컴퓨터 과학에서는 이 공간을 가상 메모리라고 부른다. OS는 프로그램의 정보를 참조하여, 프로그램에 저장된 데이터가 적절한 영역에 저장되게 한다. 프로세스가 사용할 가상 메모리를 용도별로 구획하고, 프로세스가 사용하는 데이터를 적절한 구획에 저장한다. 유사한 데이터를 모아 놓기 때문에 OS는 각 구획에 적절한 권한을 부여할 수 있으며, 개발자는 프로세스의 메모리를 더 직관적으로 이해할 수 있게 된다. 소프트웨어 리버스 엔지니어링의 핵심은, 바이너리(프로그램)를 분석하여 바이너리의 동작을 이해하는..
- [ Dreamhack/Reverse Engineering ]Quiz: Computer Architecture [★]2025-03-18 19:32:13★(시스템 해킹 로드맵과 진도가 겹친다.Background: Computer Architecture은 여기를 참고하자) Q1.rax에서 rbx를 뺐을 때, ZF가 설정되었다. rax와 rbx의 대소를 비교하시오 풀이)rax는 누산기 레지스터(범용 레지스터), rbx는 베이스 레지스터이다. 각각 함수의 반환값이 저장되고, 메모리 주소가 저장된다.현재 rax - rbx의 결과 ZF(Zero Flag)라는 플래그 레지스터가 설정되었으므로 rax와 rbx가 뭐든 간에 rax == rbx 상태일것이다. 정답) ==Q2. ★rax = 0x0123456789abcdef 일 때, al의 값은? 풀이) x86-64 아키텍처의 일반적인 범용 레지스터는 64바이트이다. 즉 rax는 현재 8바이트(64비트)이다. 따라서 al..
- [ Dreamhack/Reverse Engineering ]Background: Static Analysis vs. Dynamic Analysis2025-03-18 19:00:2501. 서론소프웨어를 분석할 때는 일반적으로 큰 구조를 먼저 관찰한다. 그러나 이것만으로 소프웨어의 실제 동작을 알기 어려울 때가 많다. 그럴 때는 실제로 프로그램을 실행해보며 동작을 관찰해볼 수 있다. 리버스 엔지니어링에서는 소프트웨어를 분석하기 위해 사용하는 분석 방법들을 크게 정적 분석(Static Analysis)과 동적 분석(Dynamic Analysis)로 구분한다. 정적 분석은 외적인 관찰만을 통해 정보를 알아내는 것을 의미하며, 동적 분석은 실행을 통해 동작을 분석하는 것을 의미한다. 우리는 대개 정적인 방법과 동적인 방법을 적절히 혼용하여야 대상을 효과적으로 분석할 수 있다. 동적인 방법만을 고수하면 큰 구조를 놓칠 수 있고, 반대로 정적인 방법만을 고수하면 실행을 통해 직관적으로 알 수..