Computer Security

#6 리눅스 CTF에서의 환경 셋팅 본문

리눅스 커널 해킹

#6 리눅스 CTF에서의 환경 셋팅

쿠리 Kuri 2022. 8. 14. 18:30
반응형

리얼 월드 셋팅과의 차이점

 

  • CTF 문제에서는 커널 이미지와 파일 시스템을 제공해 주기 때문에 따로 빌드할 필요가 없다.
  • 보통 커널 이미지중 bzImage는 제공해주지만, 디버깅에 유용한 vmlinux는 제공해주지 않는다.
  • extract-vmlinux 스크립트를 이용해 bzImage에서 vmlinux를 추출해야한다.

 

 

 


build_result

boot.sh : qemu의 실행 옵션이 들어있는 qemu script

bzImage : 빌드된 커널 이미지 파일

rootfs.cpio : 빌드된 파일 시스템. 내부에 문제 드라이버가 들어 있다.

 

CTF에서는 보통  gdb_remote.sh 를 빼고 위의 3가지를 제공해 준다.

 


위의 3개의 파일중에는 vmlinux는 없기 때문에, /usr/src/linux-headers-$(uname-r)/scripts/extract-vmlinux bzImage > vmlinux 명령을 통해 bzImage에서 vmlinux를 추출해준다.

vmlinux

 

 

하지만, 이렇게 생성된 vmlinux 이미지는 정상적으로 빌드된 vmlinux 와 달리 디버깅에서 유용한 심볼들이 삭제 된 상태이다.

 

추출한 vmlinux는 심볼은 없지만, kernel ROP(1)를 위한 각종 gadget(2)들의 주소는 구할 수 있다.

 

유저공간 포너블 문제에서 gadget을 구하듯 objdump, rp++ 툴을 이용하면 된다.

 

 

 

 

(1) ROP : gadget을 체이닝해서 프로그램 흐름을 공격자가 원하는 방향으로 흐르게하는 공격기법 이다.

 

(2) gadget : 어셈블리언어로 구성된 작은 코드 조각

 

 


리눅스 커널에서 권한 상승을 일으키기 위해선, C언어로 작성된 exploit code를 컴파이한 파일이 필요하다.

 

아래는 test를 출력하는 C프로그램을 파일 시스템에 집어넣는 과정이다.

exp.c

이러한 과정을 거치는 이유는, 빌드된 커널과 파일 시스템에는 gcc(1)와 링커(2)등이 없기 때문이다.

 

 

 

 

(1) GCC :GNU 컴파일러 모음   GNU 프로젝트의 일환으로 개발되어 널리 쓰이고 있는 컴파일러이다.

 

(2) 링커 : 컴퓨터 과학에서 컴파일러가 만들어낸 하나 이상의 목적 파일을 가져와 이를 단일 실행 프로그램으로 병합하는 프로그램이다.

 

 


gcc -o exp exp.c -static

사용할 exploit code를 -static 옵션으로 컴파일한다.

 

static으로 컴파일 하는 이유는, 빌드된 커널과 파일 시스템에는 라이브러리와 연결시켜주는 링커가 없기 때문이다.

 

 

 

 


cpio 압축해제

 

1.mkdir rootfs 명령어로 루트 파일 시스템을 압축 해제할 디렉토리를 생성한다.

 

2.rootfs.cpio를 rootfs 디렉토리로 이동시킨다.

 

3.rootfs 디렉토리에서 cpio -id -v < rootfs.cpio 명령을 통해 cpio 압축을 해제한다.

 

 

 


파일 시스템 재압축

1.옮겨진 기존의 rootfs.cpio는 삭제한 뒤, static 컴파일한 exp 파일을 현재의 rootfs 디렉토리로 이동한다.

 

2.이전의 파일 시스템 빌드 강의에서 사용했던 find . | cpio -o --format=newc > ../rootfs.cpio 명령을 이용해 파일 시스템을 재압축 한다.

 

 

 

 


./boot.sh

 

 

boot.sh 스크립트를 실행해서 qemu를 실행한 뒤, 파일 목록을 살펴보면 파일 시스템에 추가했던 exp 파일이 들어있는 것을 확인 할 수 있다!

 

 

 

 

반응형

'리눅스 커널 해킹' 카테고리의 다른 글

#8 KASLR 우회  (0) 2022.08.16
#7 리눅스 커널 보호 기법  (0) 2022.08.15
#5 리눅스 qemu&gdb 셋팅  (0) 2022.08.13
#4 리눅스 커널&파일 시스템 빌드  (0) 2022.08.12
#3 리눅스 커널 3  (0) 2022.08.11
Comments