IT 그리고 정보보안/Knowledge base 227

정적 라이브러리 (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)이라는 곳에 저장된다. 인터럽트가 일어나면, ..

리눅스 find 명령어 활용

리눅스에서 파일/디렉토리를 찾는 명령어이다. 굉장히 자주 쓰이고 기능도 많은 유용한 명령어이다. 자주쓰는 옵션에 대해 익혀두면 사용하는데 편하다. find 문법 : find [경로] [-옵션] [옵션 내용] ex) find / -perm +6000 ( / 경로 아래로 suid나 sgid가 둘 중 하나라도 걸린 모든 파일을 찾는다.) 아래는 find 플래그 옵션들이다. *************************************************************************************** -name : 파일명으로 탐색한다. -perm : 파일의 권한으로 탐색한다. [- ] : 설정된 권한의 모든 것이 설정된 파일을 찾는 것 [+ ] : 설정된 권한 중 하나라도 설정된 파..

SFX (Self-extracting file) Archive

SFX 아카이브는 자체 압축 풀림, 자동 압축 풀림을 의미하는 것이다. WinRar, WinZip, 알집 같이 압축 프로그램도 있지만 SFX 아카이브는 그냥 압축 해제가 가능하다. 윈도우에서는 exe파일 형태로, 실행하면 압축이 풀리게끔 SFX 기능을 지원하고 있다. SFX를 언급한이유는.. 이게 자동 실행 압축 풀림이니까 실행시에 압축이 풀리면서 악성코드가 실행될 수 있다는 점이다. 이 파일을 실행하게 되면 사용자의 동의 없이 폴더를 생성하고 자료파일을 저장하게 되므로. 이 동작이 악의적이라면 이건 뭐 악성코드라고 부르는 거다. 그럼 tight VNC의 소스를 일부부 수정한 프로그램을 이용하여 백도어를 한번 만들어보겠다. tight VNC는 알다시피 ( 철저하게 내 기준ㅋ.. 모르면 검색하셈) 원격 접..

반응형