systemhacking/background

system 기본 용어들

qkqhxla1 2015. 2. 4. 17:59

http://devanix.tistory.com/179 에서 퍼왔습니다. 운영자님이 binary hacks라는 책을 요약한건데


기본기가 부족한 저에게 많은 도움이 된듯... 이참에 binary hacks라는 책도 있으면 빌려야겠네요.



---------------------------------------------------------------------

[ ABI(Application Binary Interface) ]

애플리케이션이 지켜야 할 바이너리 레벨의 규약.

함수호출 시 스택 또는 레지스터 사용법, 심볼 name mangling 규칙 등이 정해져 있다.

OS, 프로세서별로 규정되어 있다.

   

[ API(Application Programming Interface ]

애플리케이션 프로그램에서 OS나 라이브러리의 기능을 이용하기 위한 함수, 데이터 구조 규약.

API를 이용한 프로그래밍은 동일한 API를 지원하는 플랫폼 간 소스코드 호환성을 갖는다는 이점이 있다.

   

[ BSS 세그먼트(Block Started by Symbol Segment) ]

초기화되지 않은 데이터가 위치하는 세그멘트.

C의 전역 변수로 int global;과 같이 초기값이 지정되지 않은 데이터가 들어간다.

오브젝트 파일 내에서는 크기를 갖지 않고 프로그램 시작 시에 커널에 의해 0으로 초기화 된다.

ELF에서의 명칭은 .bss이다.

   

[ DSO(Dynamic Shared Object) ]

GNU/리눅스에서는 동적 링크하는 공유 라이브러리를 DSO 라고 한다.

.so라는 확장자를 갖는다

   

[ DWARF(Debug With Arbitrary Record Format) ]

디버그 정보를 저장하기 위한 데이터 형식.

GNU/리눅스 + GCC 환경에서는 표준으로 사용되고 있다.

DWARF 또는 ELF는 그 이름 때문에 '반지의 제왕'과 관계가 있는 게 아닌지 의심받기도 한다.

   

[ ELF(Executable and Linking Format) ]

실행 파일, 오브젝트 파일, 공유 라이브러리, 코어 파일에 사용되는 파일 형식 중 하나.

GNU/리눅스, FreeBSD 등에서 사용되고 있다.

   

[ GCC(GNU Compile Collection) ]

GNU의 각종 컴파일러 모음. 원래는 GNU C Compiler를 의미했다.

GNU C Compiler를 나타낼 때는 gcc라고 표기한다.

   

[ glibc(GNU C Library) ]

GNU의 C 라이브러리. GNU/리눅스나 Hurd 등의 OS에서 사용되고 있다.

   

[ GNU(GNU's Not Unix) ]

본래는 GNU 프로젝트가 개발되고 있는 OS를 일컬었으나,

GNU 프로젝트 자체를 GNU로 부르는 경우가 많다

   

[ GNU/리눅스 ]

리눅스 커널 기반의 시스템.

GNU를 앞에 붙이는 이유는 커널 외의 컴포넌트를 개발하고 있는 GNU 프로젝트에 경의를 표하기 위함.

   

[ GOT(Global Offset Table) ]

PIC를 실현하기 위해 필요한 데이터.

PIC에서는 전역 데이터로의 접근을 GOT를 이용해 간접적으로 참조한다.

   

[ LLP64 ]

long long과 포인터가 64비트인 환경.

int와 long은 32비트. 64비트 윈도우에서는 LLP64.

   

[ LP64 ]

long과 포인터가 64비트인 호나경. int는 32비트. 64비트 리눅스에서는 LP64.

대부분의 유닉스 계열 OS에서는 LP64를 사용.

   

[ PIC(Position Independent Code) ]

임의의 주소에 로드 가능한 코드.

데이터 액세스나 점프는 상대 주소로 수행한다. 위치 독립 코드.

   

[ PIE(Position Independent Executable) ]

위치독립인 실행 파일. 최근의 GNU/리눅스에서 작성할 수 있다.

보안 향상 등의 장점이 있다.

   

[ PLT(Procedure Linkage Table) ]

동적 링크를 실현하기 위해 필요한 데이터.

GOT와 함께 사용해서 동적 링크한 공유 라이브러리 함수를 간접적으로 호출할 수 있다.

   

[ POSIX(Portable Operating System Inerface for UNIX) ]

시스템콜, 시그널과 같은 OS의 API를 규정하는 규약.

대부분의 유닉스 계열 OS는 POSIX를 기반으로 하고 있다(or POSIX 표준을 따르려 한다).

   

[ SUS(Single UNIX Specification) ]

유닉스로 불리는 OS를 위한 규격. 최신 버전인 SUSv3는 웹상에서 볼 수 있다.

SUSv3는 POSIX를 포함하고 있다.

   

[ TLS(Thread Local Storage) ]

여러 스레드에서 동일한 이름의 변수를 사용하더라도 실제로는 각 스레드의 독립된 영역에 저장되는데,

이를 TLS라 한다. GCC에서는 __thread라는 키워드를 사용해서 TLS를 다룬다.

   

[ prelink ]

동적 링크를 빠르게 하기 위한 방법 중 하나.

실행 파일과 공유 라이브러리를 수정함으로써 동적 링크 시 발생하는 비용을 대부분 삭감한다.

많은 리눅스 배포판에 사용되고 있다.

   

[ x86 ]

인텔(Intel)사의 8086 계열의 프로세서를 약칭함.

80486 이후 Pentium, Xeon 등의 제품명을 갖는다. IA-32라고도 한다.

   

[ x86_32 ]

x86_64와 구별하기 위해 32비트의 x86 아키텍처를 x86_32로 표기하는 경우도 있다.

   

[ x86_364 ]

AMD에서 설계한 x86 상위호환의 64비트 프로세서 아키텍처. AMD64라고도 함.

인텔도 동일한 아키텍처를 채택하고 있다. EM64T는 인텔에서 사용하는 제품명.

   

[ 인라인 어셈블리 코드(inline assembly code) ]

C와 같은 고급언어 프로그램에 삽입된 어셈블리 코드를 일컬음.

아키텍처 의존적인 처리, 최적화 등에 사용된다.

   

[ 엔디안(endian) ]

여러 바이트로 된 데이터를 어떤 순서로 저장할지를 정하는 규칙.

바이트 순서라고도 함. 엔디안이라는 명칭은 걸리버 여행기에서 유래함.

   

[ 오브젝트 파일(object file) ]

컴파일러가 생성한 중간 단계 파일.

실행 파일이나 라이브러리는 오브젝트 파일을 링크해서 만든다.

GNU/리눅스에서는 .o라는 확장자를 갖는다.

넓은 의미로는 실행 파일이나 라이브러리도 오브젝트 파일에 포함하기도 한다.

   

[ 역어셈블(disassemble) ]

기계어를 어셈블리어로 변환하는 것.

   

[ 공유 라이브러리(shared library) ]

프로그램 실행 중 메모리상에서 여러 프로그램에 의해 공유되는 라이브러리.

통상 공유 라이브러리는 동적 링크된다. 정적 링크되는 공유 라이브러리도 있으나 드물다.

공유 오브젝트라고도 함.

   

[ 재배치(relocation) ]

기계어 코드에 포함된 주소를 링크 시에 또는 로드 시에 수정하는 것.

   

[ 시그널(signal) ]

프로세스에 보내지는 동기적인 또는 비동기적인 이벤트.

POSIX에서는 SIGKILL과 SIGSTOP외의 시그널은 시그널 핸들러로 처리할 수 있다.

   

[ 시그널 핸들러(signal handler) ]

시그널을 처리하는 함수. sigaction() 또는 signal() 함수로 설정할 수 있다.

   

[ 시그니처(signature) ]

이름, 인수, 반환 값의 형태에 따라 결정되는 함수의 형식.

보통 C나 C++ 등의 컴파일 언어에서는 이름이 같아도

시그니처가 다른 함수를 호출하려 하면 경고 또는 에러가 발생한다.

   

[ 시스템콜(system call) ]

유저 레벨의 애플리케이션에서 OS 커널의 기능을 호출하기 위한 방법.

(예: open(), read(), fork(), signal())

   

[ 심볼(symbol) ]

일반적으로는 기호를 의미하지만,

Binary Hacks의 문맥에서는 링커가 함수나 변수를 식별할 때 사용하는 이름을 말한다.

   

[ 심볼 테이블(symbol table) ]

오브젝트 파일 등에 포함된 심볼의 표.

명시적으로 삭제하지 않는 한 실행 파일이나 라이브러리에 남아 있다.

   

[ 스택(stack) ]

스택 프레임을 단계적으로 쌓아가는 메모리 영역. Binary Hacks의 문맥상

스택은 「데이터 구조의 스택」이 아니라 「메모리 영역의 스택」을 가리키는 경우가 많다.

   

[ 스택 프레임(stack frame) ]

인수나 지역 변수, 보존된 레지스터, 반환 값 주소 등 함수호출에 필요한 정보를 정리한 것.

간단히 프레임이라고도 한다.

   

[ 스택 포인터(stack pointer) ]

스택 프레임을 조작하기 위해 사용하는 포인터.

x86등은 스택 포인터를 위한 전용 레지스터를 갖고 있다.

RISC 프로세서에서는 범용 레지스터 중에 하나를 스택 포인터로 정해서 사용하는 경우가 많다.

   

[ 스레드(thread) ]

프로그램 실행 단위의 하나.

프로세스와의 주된 차이점은 자원 공유 방법에 있다.

통상, 프로세스에 비해 스레드 간 자원 공유가 더 쉽다.

하나의 프로세스는 여러 스레드를 갖는다.

   

[ 스레드 안전(thread safe) ]

멀티스레드 프로그램에서 안전하게 실행할 수 있음을 일컬음.

대개의 경우 static 변수를 내부에 지닌 함수는 스레드에 안전하지 않다.

   

[ 세그먼테이션 폴트(segmentation fault) ]

접근 불가한 주소 영역에 접근하거나 쓰기 불가능한 주소 영역에 쓰기를 할 경우 발생하는 에러.

C, C++ 프로그래머는 자주 접하게 된다. 세그먼트 위반이라고도 한다.

   

[ 실행 파일(executable file) ]

실행 가능한 파일. GNU/리눅스에서는 /bin, /usr/bin등에 있다.

   

[ 정적 라이브러리(static library) ]

정적 링크되는 라이브러리. GNU/리눅스에서는 .a라는 확장자를 갖는다.

   

[ 정적 링크(static link) ]

실행 파일을 생성할 때 라이브러리를 링크하는 것.

대개 라이브러리 내용을 실행 파일내에 포함시키기 때문에 실행 시에는 라이브러리 파일이 필요 없다.

   

[ 툴 체인(toolchain) ]

컴파일러, 링커, 어셈블러 등 네이티브 프로그램을 생성하기 위해 필요한 일련의 툴을 총칭.

   

[ 데이터 세그먼트(data segment) ]

초기화된 데이터가 위치하는 세그먼트. ELF에서의 명칭은 .data 이다.

   

[ 텍스트 세그먼트(text segment) ]

기계어 코드가 위치하는 세그먼트.

통상, read-only로 설정된다. ELF에서의 명칭은 .text 이다.

   

[ 디버거(debugger) ]

프로그램 버그의 원인을 찾는 데 유용한 툴.

디버거로 프로그램을 구동시킨 후 백트레이스나 변수 조사 등을 수행한다.

   

[ 디버그 정보(debug information) ]

디버거가 필요로 하는 정보. 실행 파일이나 공유 라이브러리에 포함되어 있다.

gcc에서는 -g 옵션을 주면 생성.

   

[ demangle ]

name mangling된 심볼을 원래의 읽기 쉬운 심볼로 복원시키는 것을 말함.

(예: _ZN3Foo3BarE => Foo::Bar)

   

[ 동적 링크(dynamic link) ]

실행 시에 라이브러리를 링크하는 것.

실행 시에 라이브러리 파일이 필요함. 라이브러리가 존재하지 않으면 실행 시에 에러가 발생한다.

   

[ 동적 링크 라이브러리(dynamic link library) ]

동적 링크된 라이브러리. 윈도우에서는 DLL이라 불린다.

GNU/리눅스에서는 DSO라고 불리는 경우가 많다.

   

[ name mangling ]

함수명과 시그니처로부터 유일한 심볼을 생성하는 것을 말함.

C++나 자바(Java)등의 언어에서 사용된다. (예: Foo::Bar => _ZN3Foo3BarE)

   

[ 바이너리안(binarian) ]

Binary Hack에 정통한 엔지니어.

   

[ 백트레이스(backtrace) ]

현재 함수에 도달할 때까지 지나온 함수를 추적하는 것. 스택 트레이스라고도 함.

   

[ 힙(heap) ]

malloc() 등에 의해 동적으로 확보된 메모리 영역.

Binary Hack의 문맥상으로 힙은 「데이터 구조의 힙」이 아니라 「메모리 영역의 힙」을 가리킨다.

자유기억 영역 이라고도 함.

   

[ 중단점(break point) ]

디버거로 프로그램 실행을 일시 중지시킬 지점. 함수명이나 소스코드의 행 번호로 지정한다.

   

[ 프로그램 카운터(program counter) ]

CPU내의 레지스터 중 하나로, 현재 실행하고 있는 명령의 주소를 저장하고 있다.

PC로 줄여서 일컫기도 함. 인스트럭션 포인터라고도 함.

   

[ 프로세스(process) ]

프로그램 실행 단위의 하나. 실행 중인 프로그램의 인스턴스.

통상, 프로세스는 하나의 프로세스 ID를 갖는다.

   

[ 프로파일러(profiler) ]

프로그램의 성능을 분석하는 툴. (이 책에서는 gprof, sysprof, oprofile을 소개한다.)

   

[ 호출 규약(calling convention) ]

함수를 호출할 때 데이터를 어떤 식으로 스택에 쌓을지를 정하는 규약.

ABI의 일종. OS나 프로세서에 따라 다르다.

   

[ 런타임(runtime) ]

실행 시를 뜻함. 실행 시에 발생하는 에러를 런타임 에러라고 한다.

   

[ 링크(link) ]

오브젝트 파일이나 라이브러리를 연결하는 것. 재배치 등의 처리를 수행한다.

   

[ 리플렉션(reflection) ]

실행 중인 프로그램 자신의 정보를 조사하거나 수정하는 것을 말함.

C언어 에서는 리플렉션을 위한 기능은 없지만, Binary Hack을 이용하기에 따라 유사한 기능을 구현할 수 있다.

   

[ 로드(load) ]

실행 파일이나 라이브러리를 메모리상에 배치하는 것.


'systemhacking > background' 카테고리의 다른 글

mprotect (메모리 권한 변경)  (0) 2015.02.10
linux background 2 (binary hacks)  (0) 2015.02.08
linux background 1 (binary hacks)  (0) 2015.02.06
리버스 커넥션 쉘코드 제작  (0) 2015.01.31
쉘코드 제작, dumpcode  (0) 2014.12.29