Reversing/Reverse Engineering

    매뉴얼 언패킹(MUP) 사례 - ESP Trick으로 OEP 찾기

    📌 매뉴얼 언패킹(MUP: Manul UnPacking)의 핵심은 OEP를 찾는 것! ESP 레지스터를 활용한 OEP 찾기 스택 프레임: 함수가 사용하는 독립적인 메모리 영역 >> 함수가 실행 중일 때 존재하고 실행이 끝나면 사라짐 스택: 메모리와 달리 기준점(EBP 레지스터; 프레임 포인)을 중심으로 데이터를 참조 EBP(프레임 포인터) : 하나의 루틴에서 서브루틴으로 이동할 때 EBP 레지스터의 값을 따로 보관해둬야한다. 서브루틴에서 원래의 루틴으로 복귀할 때(return할 때) 따로 보관해뒀던 값을 EBP 레지스터에 복구시킨다. ESP(스택 포인터) : 현재 사용하는 스택의 맨 위를 가리킨다. 또한, EBP 레지스터의 값을 유지하는데 사용한다. PUSH EBP MOV EBP, ESP // 원래 루틴..

    패킹과 언패킹

    패킹과 언패킹 ◾ 패킹(packing): 프로그램 코드 크기를 압축 + 프로그램 분석을 어렵게 하기 위해 암호화 하는 것 ◽ 컴프레싱(compressing): 단순 압축 ◽ 프로텍팅(protecting): 암호화 하는 것패킹 = compressing + protecting 행 파일을 암호화해 분석을 어렵게 만드는 기술이다. ◾ 구조: 암호화된 상태의 실행코드 배포 → 실행 시, 실행 코드를 복화화해 동작 수행 언패킹 동작 방식 UPX로 패킹된 실행파일을 살펴보면 Empty Space, Packed Data, Unpacking Code로 구성되어 있다. Unpacking Code: UPX로 패킹된 파일을 언패킹할 때 필요한 코드 영역 Packed Data: 패킹된 데이터가 들어있는 영역 Empty Spac..

    어셈블리 코드 변환

    주어진 어셈블리 코드들은 모두 AT&T 문법으로 작성되어 있다. 이전에 정리했던 instructions는 intel 문법에 따른 어셈블리 코드들로, AT&T 문법에서는 intel 문법과 달리 오른쪽 operand에 값이 저장된다. 1번 .file "example1.c" .section .rodata .LC0: .string "Hello world" .text .globl main .type main, @function main: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl $.LC0, %edi movl $0, %eax call print..

    HelloWorld.exe

    ◾ 실습환경: VisualStudio 2015, IDA pro 7.0 [C] HelloWorld.exe helloworld.c (Visual Studio) #include int main() { puts("hello world!\n"); return 0; } Visual Studio에서 위의 코드를 작성하고 64bit Release 버전으로 컴파일(빌드)했다. HelloWorld.exe (IDA) 앞의 단계와 같이 빌드하고나면 "프로젝트 폴더 > x64 > Release에 HelloWorld.exe" 실행파일이 생성된다. IDA pro 64bit에 해당 실행 파일(HelloWorld.exe)를 넣고 실행하면 아래와 같은 창을 볼 수 있다. Options > General > Disassembly > Nu..

    Instruction (명령어)

    Instruction Format 명령어는 opcode + operand로 이뤄져있다. OPCode OPeRand Opcode(Operation Code) 명령 코드; 명령어에서 실제로 어떤 동작을 하는지 나타내는 부분이다. 명령코드(Opcode) 또는 기계코드(Machine Code) 바이너리를 구성하는 코드들로, CPU가 실제로 수행할 작업을 나타내는 숫자 코드다. 명령코드는 CPU의 종류별로 다른 값으로 표현될 수 있고, 명령코드의 종류에 따라 피연산자(operand)가 필요하기도 하다. 어셈블리 코드(Assembly Code) 숫자로 표현된 명령코드가 어떤 의미를 갖는지 이해하기 쉽도록 작성된(Mnemonic) 코드이다. 어셈블리어가 기계어와 1:1로 대응되 듯, 명령코드와 1:1로 대응된다. o..

    리버싱을 위한 기초 지식(구조)

    프로그램 실행 구조 컴퓨터의 기본 구조: CPU(processor) + Memory(메모리) + HDD(하드디스크) PE 포맷으로 구성된 실행파일을 클릭하면 운영체제에 있던 로더(loader)가 PE 헤더에 있는 정보를 분석해 PE 보디에 있는 코드와 데이터를 메모리에 배치하면서 프로그램이 실행된다. CPU (Central Processing Unit) 중앙 처리 장치; 기계어로 쓰여진 컴퓨터 프로그램의 명령어를 해석하고 실행하는 컴퓨터의 부분(하드웨어/칩)이다. 레지스터 (Register) : 컴퓨터의 프로세서(CPU) 내에서 자료를 보관하는 저장공간으로, 보통 현재 계산을 수행 중인 값을 저장하는 데 사용한다 산술 논리 연산 장치 (ALU; Arithmetic Logic Unit) : 산술 연산과 논..

    [dreamhack] 리버싱 엔지니어링이란

    Static Analysis VS Dynamic Analysis static analysis 프로그램을 실행시키지 않은 상태에서 분석하는 정적 분석 방법 ▶ 실행 파일을 구성하는 모든 요소, 대상 실행 파일이 실제로 동작할 CPU 아키텍쳐에 해당하는 어셈블리 코드에 대한 이해가 필요하다. dynamic analysis 프로그램을 실행시키며 입출력과 내부 동작 단계를 살피며 분석하는 동적 분석 방법 ▶실행 단게별로 자세한 동작 과정을 관찰해야 하므로, 환경에 맞는 디버거를 이용한 단계별 분석 기술이 필요하다. 코드의 Compile 과정 Source Code → Binary Code source code: 사람이 이해할 수 있는 코드 binary (code): 컴퓨터가 이해할 수 있는 형태인 프로그램 (코드..