IT 그리고 정보보안 279

PLT (Procedure Linkage Table), GOT(Global Offset Table)

PLT (Procedure Linkage Table) 한글 뜻대로 풀이하자면, 프로시져 연결 테이블이다. 사용자가 직접 제작한 프로시져인 경우 PLT를 참조한 호출이 불필요하지만 외부 라이브러리에서 땡겨와서 사용하는 프로시져인 경우 이 PLT를 참조하여 프로시져를 호출하게 된다. GOT(Global Offset Table) 프로시져들의 주소를 담고있는 테이블이다. 외부 프로시져를 호출할 때 PLT가 GOT을 참조하여 프로시져를 호출한다. LOB 이미지에서 예제 파일의 .plt와 .got를 readelf 명령으로 확인 해봤다. [gate@localhost gate]$ readelf -S gremlin2 | grep plt [ 9] .rel.plt REL 080482b0 0002b0 000030 08 A 4..

공유 라이브러리 (Shared Library)

앞전에 정적 라이브러리에 대해 알아봤다. 프로그램이 실행파일이 되면서 오브젝트 코드들이 포함되어 만들어져서 굉장히 비효율 적이라고 말한바 있다. 그럼 공유 라이브러리는??어떨까 공유 라이브러리는 프로그램 실행 파일에 라이브러리의 오브젝트 코드가 포함되는 것이 아니라 프로그램 실행 시에 필요한 오브젝트 코드를 참조하는 방식이다. 쉽게 생각하면 정적 라이브러리는 오브젝트 파일들을 "아카이브 파일"이라는 곳에 때려 넣어 모아둔다는 개념이고 공유 라이브러리는 오브젝트 파일들을 모아서 하나의 거대한 "오브젝트 파일"로 만들어 공유가 가능하게 만든 것이다. 굳이 그림을 그려주자면.. 공유 라이브러리 파일은 *.so 확장자를 가진다. 그럼 이번에는 공유라이브러리를 만들어보자. 생각보다 별거 없다. 먼저 라이브러리로 ..

정적 라이브러리 (Static Library)

정적 라이브러리에 대해서 알아보자. 라이브러리라는 것을 왜 쓰는 것일까? 간단하게 말하자면 코드의 재사용에 편리를 위해 나온 것이다. 여러 프로그램에서 중복으로 사용되는 오브젝트 파일을 하나의 파일로 다룰 수 있도록 정리해둔 것. 그렇다면 정적 라이브러리는 뭘까? 프로그램 작성시에는 일정한 분량을 나누어 각각의 오브젝트 파일로 컴파일하고 최종적으로 링크를 하여 하나의 실행가능한 파일을 생성하는 것이다. 정적 라이브러리는 .a 파일을 나타낸다. 여러개의 오브젝트 파일을 하나의 *.a 파일에 묶어서 모은다. (ar 명령으로 여러개의 오브젝트 파일을 하나의 .a 파일로 합칠 수 있다.) 쉽게 말해서 정적 라이브러리는 실행 파일에 라이브러리 코드가 포함이 되어 있다. 그래서 용량이 굉장히 크다. 비효율 적이다 ..

오브제트 파일 관련 명령어 (objdump, objcopy, nm)

objdump 명령어 오브젝트 파일을 덤프하는 명령어 objdump는 무조건 하나 이상의 플래그 옵션을 주어야만 동작한다. 이 녀석이 할 수 있는 작업은 총 2가지로 분류할 수 있다. 1. 바이너리 덤프 작업 2. 파일 디스어셈블 작업 두개다 뭐 안에 어떻게 생겨먹었는지 까보는 개념은 같지만.. 목적이 다르니 플레그 옵션을 구분지어 설명하겠음. 1. 바이너리 덤프 작업 * objdump -s 일반적인 오브젝트 파일 덤프를 뜰 때 사용한다. 보통은 오브젝트 파일 형식이 elf32-i386 이므로 섹션별로 구분지어서 덤프하야 출력된다. 지정 가능한 오브젝트 파일 형식을 보는 명령어도 있다. -i 플레그를 주면 된다. * objdump -j [섹션명] -s 로 일반적인 덤프를 뜨면 섹션별로 구분이 된다고 했는..

ldd (List Dynamic Dependencies)

objdump나 readelf 명령으로 프로그램에서 어떤 공유 라이브러리를 사용하는지 확인이 가능하지만, 사용된 공유 라이브러리가 또 어떤 다른 라이브러리를 사용하는지에 대한 관계를 알아보려면 번거롭다. 그래서 한번에 의존 관계를 알 수 있는 명령이 ldd 이다. 위와 같이 실행 파일이 필요로 하는 공유 라이브러리의 경로와 할당된 메모리 주소를 다 확인이 가능하다. 근데 사실은 이 명령어보다 중요한게 환경변수 LD_TRACE_LOADED_OBJECTS 이다. ldd는 끽해야 셸 스크립트에 불가하다. 환경변수 LD_TRACE_LOADED_OBJECTS를 1로 설정하면 프로그램 실행 시점에서 elf 인터프리터가 필요한 공유 라이브러리를 메모리에 로딩시키고 화면에 정보를 출력하고 프로그램 실행 전에 종료한다...

ELF File Format

ELF (Executable and Linking Format) 포맷에 대해 알아보자. 리눅스, 유닉스 환경에서 구동되는 프로그램의 바이너리 파일, 오브젝트 파일의 형식을 나타내는 것이다. ​윈도우로 치면 PE포맷임. 오브젝트 파일 포스트에서 ELF 포맷을 공부하기 위해 오브젝트 파일의 몇가지 분류에 대해 설명했다. ELF 포맷도 마찬가지로 용도가 조금 다르다. 다시 한번 설명함.. 1. 실행 가능한 오브젝트 파일 (Executable object file) -> 말 그대로 실행 가능한 파일 2. 공유 오브젝트 파일 (Shared object file) -> 다른 공유 오브젝트 파일이나 재배치 가능한 오브젝트 파일과 링크하여 새 오브젝트파일을 만듦 3. 재배치 가능한 오브젝트 파일 (Relocatable..

od(octal dump)

기본적으로는 바이너리 파일을 8진수로 덤프떠서 출력하는 툴인데, 여러가지 플레그를 주어 출력 방식을 바꿀 수 있다. -t 옵션을 이용하여 옵션을 준다. 아래 나오는 각 항목 별로 하나씩 선택해서 옵션을 줄 수 있다. 여기서 -t 옵션으로 바이너리 값들의 표현 형식을 지정할 수 있다. 그리고 -A 옵션에 덧붙여 옵셋의 표기 형식도 정할 수 있다. 뭐 보통은 거의 16진수가 대부분이니 od를 쓸 때 항상 -t x1 -A x 는 기본. 1. 형식 지정 2. 자료형 a : 문자이름(ASCII) C : char d : 부호가 있는 10진수 I : int u : 부호가 없는 10진수 S : short o : 8진수 L : long x : 16진수 F : float D : double L : long double -..

C언어 컴파일 과정

이번 포스팅에서는 컴파일하는 과정에 대해서 심도 깊게 알아보기로 하자. 일단 먼저 그림부터 그려놓고? 보겠음 먼저 위 그림에 나온 과정들은 gcc(GNU C Compiler)를 사용해서 컴파일 한다고 가정하겠다. gcc도 이름은 컴파일러지만, 실제로 따지고 보면 컴파일러 역할을 한다기 보다 위에 전처리기, 컴파일러, 어셈블러 들을 불러오는 역할을 한다. * abc.c -> abc.i 코딩한 c 소스파일이 전처리기를 통해 .i 파일로 바뀌는 과정이다. cpp0 라는 전처리기를 이용하여 전처리 과정을 거치는 것인데. 쉽게 생각하여 #이 붙은 녀석들을 처리하는 것이다. #include문 같이 특정 라이브러리를 끌어오는 역할 * abc.i -> abc.s 진짜 레알 컴파일하는 과정임. gcc에서 cc1 이라는 ..

Shell 실행 함수 종류

execl() int execl(const char *path, const char *arg0, ..., const char *argn, (char *)0); 디렉토리와 파일 이름이 합쳐진 절대 경로로써 파일 이름을 입력해 주어야 한다. 그리고 argv[n]의 값을 수정할 수 있다. e.g. execl("/bin/sh", "/bin/sh", NULL); execle() int execle( const char *path, const char *arg ,..., char * const envp[]); execl()과 같지만 환경변수까지 설정할 수 있는 함수이다. 다른건 execl()과 같음. execlp() int execlp( const char *file, const char *arg, ...); 환경..

시스템 콜 (System Call)

시스템 콜이란? 응용 프로그램에서 OS에게 "이것좀 처리해주세요" 하면서 부르는 것. 즉, 커널에서 사용자에게 제공하는 함수를 호출하라 이런 기능으로 쓰이는 것이다. 시스템 콜을 활용하면 굳이 로우레벨 언어에 대한 이해가 없더라도 손쉽게 프로그래밍을 할 수 있다. (그래서 지금 우리처럼 고급언어로만 코딩을 하는 시대에 이르렀지..) 소프트웨어 인터럽트에는 고유한 번호가 존재한다. 커널에서 시스템콜의 기능에 따라 구분짓기 위해 고유하게 붙여놓은 번호인데, 커널은 이 번호를 보고 그에 따른 서비스 루틴을 수행한다. 시스템 콜은 "소프트웨어 인터럽트"의 한 종류이다. 위에서 설명한 기능별로 구분지은 고유번호는 IDT(Interrupt Descriptor Table)이라는 곳에 저장된다. 인터럽트가 일어나면, ..

반응형