[Kernel] 커널에서 외워야할 명령어들

sangjun

·

2021. 7. 21. 02:37

 

명령어

 

1. CTF에서 xxx.sh BzImage rootfs.cpio 3가지 파일이 주어진다.

--> vmlinux추출해야된다.

--> vmlinux 추출법

/usr/src/linux-headers-$(uname -r)/scripts/extract-vmlinux bzImage > vmlinux

 

2. Exploit파일을 파일 시스템에 넣고 실행하는법

 

- 커널을 부팅하면 링커와 gcc등이 없기  때문에 정적링킹으로 컴파일하여 파일 시스템에 넣어줘야 한다.

gcc -static -o my_ex my_ex.c -no-pie

 

-파일 시스템에 넣는 방법 

--> rootfs.cpio를 압축해제하고 Exploit파일을 포함시켜 다시 재압축한다.

 

- 압축 해제

mkdir rootfs
mv ./rootfs.cpio ./rootfs
cd ./rootfs
cpio -id -v < rootfs.cpio

 

-재압축

cp ../my_ex .
find .| cpio -o --format=newc > ../rootfs.cpio
rm ./rootfs.cpio

 

3. Qemu설치

sudo apt-get install qemu-kvm

 

4. GDB디버깅 할 때

gdb -q ./vmlinux
./start.sh -S -gdb tcp:127.0.0.1:1234
target remote 127.0.0.1:1234

 

5. Kernel.ko모듈파일 얻는법

mv core.cpio core.gz
gzip -d core.gz
cpio -id -v < core

6. 위의 방법처럼 했는데 모듈 파일 없을 때 아래 파일 위치 확인해보기

/lib/modules/

 

7. 커널 버전 확인법

file bzImage

 

8. 디버깅 attach 방법 v.2

gdb -q vmlinux
add-symbol-file baby/lib/modules/4.4.72/babydriver.ko 0xffffffffc0000000
target remote :1234

https://defenit.kr/2019/10/18/Pwn/%E3%84%B4%20WriteUps/CISCN-2017-babydriver-Write-Up-linux-kernel-UAF/

 

9. objdump로 vmlinux에서 가젯 뽑기

objdump -M intel -d vmlinux | grep "iretq"

 

10. 배쉬 스크립트로 압축해제랑 재압축 손쉽게 하기

 

- 재압축 스크립트 ( tmp/extracted 에 exploit코드 넣어주기)

#!/bin/sh
cp ./exploit ./temp/extracted
cd temp
rm ./initramfs.cpio 2> /dev/null
cd ./extracted
find ./ -print0 | cpio --owner root --null -o --format=newc > ../initramfs.cpio
gzip -f ../initramfs.cpio
cd ../../
cp temp/initramfs.cpio.gz .

- 압축해제 스크립트

#!/bin/sh

mkdir temp
cp initramfs.cpio.gz temp
cd temp
sudo rm -r ./extracted
mkdir extracted
cd extracted
gzip -d ../initramfs.cpio.gz
cpio -id < ../initramfs.cpio
cd ../
echo "[+] Extraction Completed"

- exploit 코드 컴파일 Makefile 

all:
	gcc -masm=intel -static exploit.c -ggdb -fno-pic -o exploit

 

11. 커널 디버깅 시에 -no-pie옵션 주고 아래 스크립트 추가해서 어느 포인트에서 레지스터 상태 보기

--> 레지스터에 커널 공간이 남아있으면 /proc/kallsyms를 확인하거나 vmlinux확인해서 오프셋 확인하기

printf("%p", shellcode);
getchar();

 

12. vmlinuz만 주어졌을 경우 --> vmlinux로 unpack해주기

binwalk e <file>

13. Skeleton Qemu Script

qemu-system-x86-64\
-m 512M\
-kernel ./bzImage\
-initrd ./rootfs.cpio\
-append "root=/dev/ram rw console=ttyS0 oops=panic panic=1 quiet nokaslr"\
-s\
-netdev user,id=t0, -device e1000,netdev=t0,id=nic0\
-nographic\
-cpu qemu64,smep\

###################
-m 512M 주메모리를 512mb할당
-kernel ./bzImage bzImage를 사용할 커널 이미지로 지정
-initrd ./rootfs.cpio rootfs.cpio를 사용할 파일 시스템으로 지정
-append "nokaslr" KASLR 보호기법 설정 X
-cpu smep SMEP보호기법 적용 O
-s gdb remote attach를 위해 1234포트 개방