본문 바로가기

Security/Reverse Engineering17

[Reversing]네임드 객체 ▣ 네임드 객체 - 일부 커널 객체는 시스템 상에서 자신을 고유하게 구별할 수 있는 이름을 가질 수 있음 - 여러 프로세스가 동일한 이름의 객체를 사용하면 각 프로세스가 사용하는 해당 객체는 동일하다는 것이 보장됨 - 이미 존재하는 객체에 대해 CreateMutex와 같이 객체를 생성하는 API가 호출되면 커널은 자동으로 해당 객체를 글로벌 테이블에 위치시키고 해당 객체에 대한 핸들을 반환함 - 네임드 객체는 계층 디렉토리 구조로 배치됨(User Mode에 Win32 API로 접근 불가능) [주요 객체 디렉토리] ▶ BaseNamedObjects - 전통적인 Win32네임드 객체 저장 - 모든 네임드 객체 Win32 API는 자동으로 이 디렉토리를 사용(APP는 이를 변경 할 수 없다) ▶ Devices.. 2010. 5. 3.
[Reversing]객체와 핸들 ▣ 객체와 핸들 - 원도우 커널은 객체 관리자에 의해서 객체가 관리됨 - 커널 관련 객체만 관리(섹션, 파일, 디바이스 드라이버, 동기화 객체, 프로세스, 쓰레드 등) - 모든 객체는 단순희 nonpaged pool 커널 메모리에 저장된 데이터 구조체임 - 객체는 해당 객체의 표준 객체 헤더만 알고 있음 ● 핸들 - App는 객체 데이터 구조체에 직접 접근 못함 → 핸들을 이용해 객체 접근 - 프로세스 안에서 객체를 구별하기 위한 숫자로 이뤄진 구분자 - 핸들 값은 프로세스 핸들 테이블에서의 해당 객체에 대한 인덱스 값 [객체와 프로세스 핸들 테이블] ○ 액세스 마스크(Access Mask) : 두개의 16bit 액세스 플래그 워드로 구성(32bit)된 정수 - 상위워드 : GENERIC_WORD, GE.. 2010. 5. 3.
[Reversing]색션 객체, VAD트리, User mode Mem, Mem 관리 API ■ 색션 객체 - OS가 관리하는 특별한 메모리 - 하나 이상의 공간에 매핑 될 수 있음(App간에 공유메모리 설정이 쉬워진다) - 시스템은 색션객체를 이용하여 커널모드 프로세스와 유저모드 프로세스 간에 메모리를 공유할 수 있음 - Win32에서는 “메모리 맵 파일”이라고 부름 • Pagefile-Backed : 정보를 일시적으로 저장하고 프로세스 간이나 App 간, 커널과의 데이터 공유를 위해서 사용됨. • File-Backed : 하드 드라이브의 물리 파일을 매핑함 이 섹션은 매핑되면서 매핑 대상의 파일의 내용을 포함하며, 매핑된 메모리 내용이 변경되면 파일의 내용도 그대로 변경됨. 이는 메모리 영역의 포인터만을 이용해서 직접 파일의 내용에 접근이 가능함을 의미함 ■ VAD 트리(Virtual Add.. 2010. 4. 29.
[Reversing]윈도우 커널 메모리 주소 공간 ■ 윈도우 커널 메모리 주소 공간의 전형적인 레이아웃 ● 커널 메모리 공간 - 커널을 위해서는 2GB가 예약됨 - 커널 자체의 코드뿐만 아니라 디바이스 드라이버와 같은 커널 컴포넌트들의 코드가 모두 포한됨 ● Paged Pool과 Non-Paged Pool - paged pool과 nonpaged pool은 모든 커널 컴포넌트에 의해서 사용되는 커널 모드 힙(Heap)메모리(커널 모드 코드만 접근 가능) ● 시스템 캐시 - 윈도우의 캐시 관리자가 현재의 모든 캐시 마핑릉 매핑하는 공간 - 캐싱은 파일을 메모리에 매핑함으로서 이루어지며, 메모리 관리자가 각 파일 매핑에 할당된 물리 메모리의 용약을 관리함 ● 터미널 서비스 세션 공간 - Win32 서브시스템의 커널 모드 컴포넌트가 이 메모리 공간 사용 - .. 2010. 4. 25.
[Reversing]compiler, JavaVM, Mem Structure ■compiler : 소스파일을 이용해서 그에 대응되는 기계어 코드 파일을 만들어 냄. 플랫폼에 종속적임 C, C++ → 컴파일러 → 목적코드 ■목적코드 : 인간보다 기계가 이해하기 쉽다. 역으로 말하면 인간이 읽고 이해하기 힘들다. ■Java Virtual machine : java와 같은 하이레벨 언어는 목적코드 대신에 바이트코드를 생성함. 이 바이트 코드를 해석해서 의미대로 작업을 수행함.(어느 시점에서는 바이트 코드를 CPU가 실행할 수 있는 목적코드로 변환해야 함)(플랫폼에 종속적이지 않다.) Java compiler → bytecode → virtual machine → object code → CPU ■원시소스가 exe실행 파일이 되는 과정 ■메모리 구조와 각 영역의 역할 2010. 4. 22.