티스토리 뷰

ELF statifier 는 동적 링크된 실행 파일과 공유 라이브러리를 하나의 파일로 합치기 위한 툴로 동적 실행 파일에서 정적 실행 파일을 생성합니다. 침해사고 시스템을 분석할 때는 라이브러리에 의존하지 않기 위해 정적 실행 파일을 사용해야 하지만 정적 컴파일 된 파일은 사이즈가 크다는 단점이 존재합니다.

 

동적으로 링크 된 공유 라이브러리는 정적으로 링크 된 공유 라이브러리보다 디스크 공간을 효율적으로 사용하며, 보다 효율적인 방식으로 보안 업데이트를 수행 할 수 있습니다. 그리고 동적 라이브러리의 특정 버전으로 컴파일 된 실행 파일은 해당 버전의 공유 라이브러리가 실행중인 시스템에서만 사용이 가능합니다.

 

Fedora 9 와 openSUSE 11 를 각각 실행해 보면 일부 공유 라이브러리의 버전이 다른 것을 볼 수 있으며 이러한 버전 차이로 인해 컴퓨터간에 실행 파일을 복사하더라도 파일을 실행할 수 없습니다. 하지만 ELF Statifier 를 이용하면 동적 라이브러리를 찾는 실행 파일 대신에 공유 라이브러리를 포함한 정적으로 링크 된 실행 파일을 만들 수 있으며 Fedora 컴퓨터에서 컴파일 한 실행 파일을 다시 컴파일하지 않고도 openSUSE 시스템에서 실행할 수 있습니다. 물론 실행 파일을 복사하는 시스템과 실행 파일을 복사하려는 시스템은 동일한 아키텍처를 가져야합니다.

 

물론 이렇게하려면 정적 실행 파일에 필요한 공유 라이브러리 복사본이 포함되어 있기 때문에 일부 디스크 공간을 희생해야하지만 요즘에는 디스크 공간이 크기 때문에 중요하지 않습니다. 실행 파일이 libfoo 라는 공유 라이브러리에 동적으로 링크되어 있고 libfoo 에 대한 보안 업데이트가 있는 경우 어떻게 될지 고려해 보십시오. 응용 프로그램이 동적으로 링크되어 있다면 libfoo 의 공유 사본을 업데이트 할 수 있으며 응용 프로그램은 더 이상 이전 libfoo 의 보안 문제로 취약하지 않습니다. 반면에 정적으로 링크 된 실행 파일의 경우 이전 libfoo 라는 공유 라이브러리 복사본이 포함되어 있기 때문에 최신 libfoo 및 보안 업데이트를 적용하려면 정적으로 링크 된 실행 파일을 다시 만들어야 합니다.

 

[Statifier 설치]

ELF Statifier 는 openSUSE 10.3 에서는 1-Click 으로 설치되지만 Ubuntu 나 Fedora 에서는 1-Click 으로 설치되지 않습니다. 여기서는 ELF Statifier 1.6.14 버전을 사용했으며 ELF Statifier 는 자동 도구를 사용하지 않으므로 간단하게 호출하여 컴파일 할 수 있습니다. make 컴파일과 설치는 아래와 같습니다.

 

 # tar xzvf statifier-1.6.14.tar.gz 
 # cd ./statifier-* 
 # make 
 # make install

 

[ASLR 해제]

정적 실행 파일을 만들기 전 메모리상의 공격을 방어하기 위해 주소 공간배치를 난수화 시키는 기법(ASLR : Address Space Layout Randomization) 은 비활성화해야 합니다. 주소 공간배치를 난수화하면 실행 파일을 실행할 때마다 libc 함수의 위치가 항상 바뀌기 때문에 return-to-libc 공격과 같은 BOF 공격으로부터 메모리를 보호하게 됩니다. 하지만 정상적인 정적 실행 파일 또한 실행이 불가합니다.

([Linux] 메모리 보호 기법[Linux] 메모리 보호 기법 중 ASLR와 NX 설정값 확인 및 변경글을 참고해주세요.)

 

아래와 같이 randomize_va_space 매개 변수를 변경하여 보안을 해제합니다. randomize_va_space 변경은 실행 파일 자체에 대한 공격뿐만 아니라 버퍼 오버 플로우에 의존하여 시스템을 손상시키는 공격 시도에도 영향을 미칩니다. 주소 공간배치 난수화가 없으면 두 공격에 더 취약 해집니다.

아래와 같이 randomize_va_space를 0으로 설정하고 정적 실행 파일을 만들면 됩니다.

 # cd /proc/sys/kernel
 # cat randomize_va_space 
 2 
 # echo 0 > randomize_va_space 
 # cat randomize_va_space 
 0

 

[정적 실행 파일 생성]

다음으로 statifier 유틸리티를 사용하는 방법의 예로서, ls 명령에 대한 정적 실행 파일을 생성해보겠습니다.

먼저 동적으로 링크 된 실행 파일의 복사본을 만들고 동적으로 링크 된 파일을 검사합니다.

statifier 는 동적으로 링크 된 실행 파일의 경로를 첫 번째 인수로 사용하고 정적으로 링크 된 실행 파일을 두 번째 인수로 만들려는 경로로 실행합니다.

ldd 명령은 ls-static 이 동적으로 링크 된 라이브러리를 필요로하지 않다고 보여주고 있습니다.

다음 명령은 정적 실행 파일 ls 에서 바이너리 크기가 크게 증가한 것을 보여줍니다.

 

 # mkdir test
 # cd ./test 
 # cp -a /bin/ls ls-dynamic 
 # ls -lh 
 -rwxr-xr-x 1 root root 112K 2008-08-01 04:05 ls-dynamic 
 # ldd ls-dynamic 
 linux -gate.so.1 => (0x00110000) 
 librt.so.1 => /lib/librt.so.1 (0x00a3a000) 
 libselinux.so.1 => /lib/libselinux.so.1 (0x00a06000) 
 libacl.so .1 => /lib/libacl.so.1 (0x00d8a000) 
 libc.so.6 => /lib/libc.so.6 (0x0084e000) 
 libpthread.so.0 => /lib/libpthread.so.0 (0x009eb000 ) 
 /lib/ld-linux.so.2 (0x0082e000) 
 libdl.so.2 => /lib/libdl.so.2 (0x009e4000) 
 libattr.so.1 => /lib/libattr.so.1 (0x0606d000)
 # statifier ls-dynamic ls-static 
 # ldd ls-static 
 not a dynamic executable
 # ls -lh ls-static 
 -rwxr-x --- 1 root root 2.0M 2008-10-03 12:05 ls-static
 # ls-static / tmp 
 ... 

 

[문제해결1]

 # ls-static -lh 
 Segmentation fault

statified 실행 파일을 실행할 때 세그먼테이션 오류가 발생하면 스택 무작위화를 비활성화하고 statified 실행 파일을 다시 작성해야 합니다. 또한 정적 컴파일된 파일을 복사 후 실행하려면 ASLR 기능을 사용하지 않아야 합니다.

 

[문제해결2]

 조건  A-PC CentOS 실행 A-PC Ubuntu 실행 B-PC CentOS 실행 B-PC Ubuntu 실행
 A-PC CentOS에서
컴파일
 O   O   X  X
 B-PC CentOS에서
컴파일
 O  O  O  O

PC가 달라지면 실행이 안되는 경우도 발생 할 수 있으니 충분히 테스트해보시기 바랍니다.

 

[참고사이트]

원문 : https://www.linux.com/news/quickly-move-executable-between-systems-elf-statifier

ELF statifier 설명 : http://statifier.sourceforge.net/

ELF statifier 다운로드 : https://sourceforge.net/projects/statifier/

댓글
공지사항