exploit binary를 커널 이미지에 삽입하기.
·
Kernel Exploit/Theory
앞서 생성한 것과 같이 bzImage는 kernel, rootfs.cpio는 기본적인 파일 시스템의 구조만 가지고 있으며, qemu로 실행 시 rootfs.cpio의 파일들만 나타날 것이다. 그러므로 익스코드 작성 후 해당 익스 바이너리를 rootfs.cpio 파일 내에 넣어줘야한다. cpio 파일 압축 해제 명령어는 아래와 같고 cpio -idv rootfs.cpio 더불어 바이너리는 커널과 파일 시스템 내에 링커가 없기 때문에 -static 옵션을 주고 컴파일해야한다. 또는 base64로 인코딩..
vmlinux 추출하기
·
Kernel Exploit/Theory
vmlinux 앞선 kernel image build 시에도 언급한 것과 같이 vmlinux는 커널 디버깅에 사용할 여러 주소들과 값들을 가지고 있으며, 보통 CTF에서는 제공되지 않는 경우가 많다. (용량이 커서?!) 그러므로 아래와 같이 추출 가능하다. extract-vmlinux bzImage 파일에서 vmlinux를 추출할 수 있는데, 다음과 같은 명령어로 추출할 수 있다. /usr/src/linux-headers-$(uname -r)/scripts/extract-vmlinux bzImage > vmlinux 다만 추출된 파일에서는 심볼들이 삭제된 상태이지만, objdump, ROPgadget 등으로 ROP을 위한 gadget의 주소는 구할 수 있다.
qemu 및 gdb setting
·
Kernel Exploit/Theory
qemu란? vmware와 같은 가상 머신 에뮬레이터이다. 보통 ctf에서는 앞서 만든 bzImage와 rootfs.cpio (+vmlinux는 주어지기도하고 아닐수도 있음) 파일로 qemu를 통해 가상 머신을 실행할 수 있다. run.sh qemu가 어떻게 구동될지 설정을 담고 있는 파일이다. #!/bin/sh qemu-system-x86_64 \ -m 64M \ -nographic \ -kernel bzImage \ -append "console=ttyS0 loglevel=3 oops=panic panic=-1 nopti nokaslr" \ -no-reboot \ -smp 1 \ -monitor /dev/null \ -initrd rootfs.cpio \ -net nic,model=virtio \ -..
Kernel exploit - kernel build 및 file system build
·
Kernel Exploit
서론 CTF에서 kernel 관련 문제의 경우 기본적으로 관련 시스템 환경이 구성된 상태로 파일로 제공된다. 물론 해당 파일만으로 어떻게 분석하는지, 어떻게 사용하는지만 알면 "문제를 푸는 것"은 충분히 가능하다고 본다. 하지만, 살짝만 더 들어가서 공부해보자. 시작하기 전에 간단히 설명하자면 os를 구동하기 위한 기본적인 파일들이 필요한데 컴퓨터와 명령어를 주고 받기 위한 kernel 파일 그리고 기본적으로 디렉토리가 어떻게 구성되어있는지, 어떻게 관리하는지 등을 위한 file system으로 구성된다. kernel build 1. 패키지 설치 커널을 빌드하기 위해서는 여러 패키지들이 필요하다. 대략 아래와 같다. build-essential libncurses5 libncurses5-dev bin86..
Kernel exploit - 모듈 프로그래밍
·
Kernel Exploit
모듈이란? 모듈은 동적으로 커널에 등록하거나 제거할 수 있는 프로그램을 이야기한다. 이를 통해 커널을 재 컴파일 하지 않고 기능을 추가하거나 제거할 수 있다. 모듈 프로그래밍 및 컴파일 모듈 코드는 보통 위쪽에 작동할 코드가 작성되고, 가장 아래에 모듈을 실행하는 함수인 module_init(함수 명) 과 종료하는 함수인 module_exit(함수 명) 이 작성된다. 이렇게 코드 작성 후 컴파일을 위해서는 별도 명령어들이 필요한데, Makefile이라는 컴파일 명령어로 구성된 파일을 작성한 뒤 make 명령어를 통해 모듈을 컴파일할 수 있으며, 확장자는 .ko가 된다. 모듈의 등록 및 제거 이렇게 작성된 모듈은 insmod filename rmmod filename 로 등록과 제거가 가능하다. 모듈의 l..
Kernel exploit - 디바이스 드라이버
·
Kernel Exploit
디바이스 드라이버란? 컴퓨터와 연결된 장치들과 상호작용을 하기 위해 해당 장치로 접근할 수 있게 해주는 소프트웨어를 이야기한다. 커널이 컴파일 될 때부터 포함된 디바이스 드라이버도 있지만, 나중에 커널 부팅 시 또는 부팅 후 로드되는 드라이버도 있다. 이는 모듈의 일종이기에 모듈 프로그래밍을 통해 프로그래밍할 수 있다. 디바이스 드라이버의 종류 character device, block device, network device가 있다. character device 디바이스를 파일과 같이 직접 접근해서 사용할 수 있도록 하는 드라이버다. 키보드, 마우스와 같은 드라이버를 이야기한다. block device 하드디스크와 같은 파일 시스템과 관련된 디바이스 드라이버이다. network device 네트워크 ..
Kernel exploit - 슬랩 할당자
·
Kernel Exploit
슬랩 할당자란? 커널에서 사용하는 동적 메모리 할당자이다. 쉽게, 유저모드에서 사용하는 heap과 유사하다고 보면 된다. 특이점은 메모리 풀 구조를 가지고 있으며, 미리 고정된 크기의 메모리 블록들을 할당해 놓는다는 것이다. 슬랩 할당자는 slab, slub, slob의 3가지 방식이 있는데, 결론은 현재 대부분 slub을 사용한다. 슬랩 할당자, 슬랩 캐시, 슬랩 객체, 슬랩 페이지 슬랩할당자 kmalloc_cache[]라는 전역 배열을 이용해 각 슬랩 캐시들을 관리한다. slab_common.c - mm/slab_common.c - Linux source code (v6.4.8) - Bootlin slab_common.c - mm/slab_common.c - Linux source code (v6.4..
Kernel exploit - task란
·
Kernel Exploit
Task란? 다소 검색을 해봤는데 그 의미가 모호한 것 같다. 태스크를 태스크라고도 하고, 스레드라고도하고 프로세스라고 표현한다고 하는데... 지금 공부하고 있는 시점에서는 크게 중요하지 않은 것 같다. 결국은 태스크는 작업 실행 단위를 이야기한다. task_struct란? 결국 모든 태스크들은 task_struct 구조체를 통해 관리하게 된다. 태스크 또는 스레드가 생성되면 do_fork()라는 커널 함수를 거치면서 이 task_struct를 생성하는데, 이 때 권한이나 주소 등을 task_struct 구조체에 넣어두게 된다. 즉, fork(), vfork(), pthread_create() 등의 함수를 어플리케이션에서 실행하면 라이브러리에서 해당 함수를 찾아 실행하며, 라이브러리에서는 다시 clone..
Kernel exploit - 커널이란
·
Kernel Exploit
그래서 kernel이 뭔데? 요약하자면, 운영체제의 핵심이 되는 소프트웨어이다. 우리가 실행하는 프로그램들은 CPU, memory, device 들과 상호작용을 직접적으로 하는 것 같아 보이지만, 실제로는 kernel을 통해 모두 이루어진다. 즉, 각 자원들을 관리하는 것이 kernel이다. 어디에 있는가? 일반적인 binary exploit 시에 많이 보던 메모리 구조는 아래와 같다. [ Legend: Code | Heap | Stack ] Start End Offset Perm Path 0x00555555554000 0x00555555558000 0x00000000000000 r-- /usr/bin/dash 0x00555555558000 0x0055555556c000 0x00000000004000 r..
Kernel exploit - 들어가며.
·
Kernel Exploit
kernel exploit은 계속 공부 해야지 해야지 하고 있었지만 미뤄뒀던 분야이다. 잠시 공부해볼까 했지만, 글로 이해하기는 어려운 부분이 다소 있어서 더더욱 그랬다. 최근 영상을 통해 공부를 할 수 있는 기회가 생겨 이를 최대한 남겨두려한다. 지금까지 그랬듯, 이번에도 누가 봐도 이해할 수 있도록 자료를 남기는 것이 목표이다. 또한 지금까지 그랬듯, 누군가 보게된다면 조금이나마 도움이 되었으면 좋겠다.