분류 전체보기99 [Reversing] Code to Execution(x86) 먼저 compile 방식과 interpreter 방식의 차이를 알아보자.컴파일 코드 (Compiled Code)설명: 소스 코드를 한 번에 기계어(바이너리)로 변환한 후 실행.컴파일러 사용: 예) gcc, javac속도: 보통 빠름 (이미 기계어로 변환되어 있어서)예시 언어: C, C++, Go, Rust장점:실행 속도가 빠름최적화가 잘 됨단점:코드 변경 시마다 다시 컴파일 필요디버깅이 약간 어려울 수 있음인터프리터 코드 (Interpreted Code)설명: 소스 코드를 한 줄씩 읽어서 바로 실행함.인터프리터 사용: 예) python, node속도: 보통 느림 (한 줄씩 읽어서 실행하므로)예시 언어: Python, JavaScript, Ruby, Bash장점:빠르게 실행 결과 확인 가능디버깅이 쉬움단점.. 2025. 4. 7. [Reversing] Calling Convention(호출 규약) Calling ConventionCalling Convention(함수 호출 규약)이란 '함수 호출 시 인자(parameter) 전달 및 반환값을 처리하는 방식에 관한 규약'이다. Calling Convention은 다음과 같은 것들을 정의한다. 인수(argument)를 어떤 순서로 전달할지 - 오른쪽에서 왼쪽?인수를 어디에 저장할지 - 레지스터에? 스택(stack)에?함수가 반환값을 어디에 저장할지 - eax? stack frame을 누가 정리할지 - Caller? Callee?어떤 레지스터를 보존해야 할지 - 함수 호출 전에 저장하고, 호출 후 복구해야하는 레지스터대표적인 Calling Convention들은 다음과 같다. Calling Convention들을 하나씩 살펴보자. _cdecl 인자를.. 2025. 4. 7. [Reversing] Memory Structure x86 환경에서의 메모리 구조 메모리는 프로세스 동작과 실행에 필요한 정보를 저장한다. (IA-32)x86 환경을 기준으로 4GB(2**32 byte = 4GB)의 메모리를 가지는데, 2GB 단위로 OS가 사용하는 커널 영역과 사용자가 실행한 프로세스가 사용하는 유저 영역으로 나뉜다. 지금까지 본 메모리의 구조는 물리(Real/Physical) 메모리이 구조이고, 다음에 알아야 할 것은 가상(Virtual/Logical) 메모리이다. 실제 프로세스가 저장된 물리 메모리는 2GB이지만, 하나의 프로세스는 4GB 크기의 하나의 가상 메모리를 가진다. 당연하지만, 물리 메모리 상의 실제 메모리 주소와 가상 메모리 상의 주소는 다르며 CPU에 있는 MMU(Memory Management Unit)이 가상 주.. 2025. 4. 7. [Reversing] Assembly Language - Instruction Set 명령어 집합 구조(Instruction Set Architacture; ISA)명령어 집합 구조(ISA)는 하드웨어와 소프트웨어 간의 인터페이스 역할을 하며, CPU가 이해하고 실행할 수 있는 명령어들의 집합과 형식, 동작 방식을 정의한다. 명령어 집합 분류에는 CISC와 RISC가 있다. 아래의 표를 참고하자(내가 공부할 부분은 IA-32(x86)이기 때문에 CISC를 해볼 예정이다). 일반적인 명령은 Opcode(operation code)와 하나 이상의 Operand로 구성된다. Opcode - MOV 같은 명령어Operand - EIP와 같이 명령이 전달되는 인자(Opcode에 따라 Operand가 존재하지 않는 경우도 존재) 주소 지정 체계(Addressing Modes)주소 지정 체계는.. 2025. 3. 31. [Reversing] Register 리버싱과 관련된 CPU 구조CPU Register: CPU 내부의 임시 저장 공간으로 연산에 필요한 데이터를 임시로 저장하고 처리 속도를 높이기 위해 사용범용 레지스터(general purpose register), segment register, status registerProgram Counter(PC): 다음에 실행할 명령어의 메모리 주소를 저장x86 - EIP(extended instruction pointer) x64 - RIP(register instruction pointer)Condition Codes: 최근 연산에 대한 상태 정보를 저장, 연산 결과에 따라 설정되는 Flag들로 구성된 status register 내의 비트들을 의미한다. status register, flag regis.. 2025. 3. 31. [Reversing] 데이터 구성 단위, Endian, 보수(Complement) 데이터 구성 단위 일반적으로 모든 디지털 시스템에서는 2진수(binary)를 사용해서 데이터를 저장하고 처리한다. 즉, 2진수는 디지털 데이터의 최소 단위이며 bit 단위를 사용한다. 하지만, 저장 장치(storage)의 용량이 증가하면서 메모리의 데이터 저장 최소 단위인 byte가 주로 사용되게 되었다. 데이터 구성 단위는 다음과 같이 구성되어있다. nibble(1/2 byte, 4bit)과 word(2 byte, 16 bit)는 다소 어색할테니 기억해두자. 16진수(hexadecimal)모든 데이터를 2진수로 표현하면 비효율적이기에 2진수를 nibble(1/2 byte, 4bit) 단위로 묶어서 표현한다. 16진수 구분 기호: 0x, x, $, &H, h 등 Big-Endian(BE) & L.. 2025. 3. 31. 이전 1 2 3 4 ··· 17 다음