where is flag in kernel ctf

항상 헷갈려서 정리해 놀려고 한다.

Shell
#!/bin/sh

# timeout --foreground/ 300 qemu-system-x86_64 \
    qemu-system-x86_64 \
    -m 64M \
    -nographic \
    -kernel bzImage \
    -initrd rootfs.cpio.gz \
    -hda flag \
    -append "console=ttyS0 quiet oops=panic loglevel=3 panic=-1 panic_on_warn=1 pti=on kaslr page_alloc.shuffle=1 root=/dev/sda" \
    -no-reboot \
    -cpu kvm64,+smap,+smep \
    -monitor /dev/null \
    -net nic,model=virtio \
    -net user \
    -S -gdb tcp:0.0.0.0:41234

보통 run.sh 에서 다음과 같이 시작을 하는데

여기서 -hda flag 을 보면 flag를 드라이브로 넣는다( 호스트(또는 컨테이너) 파일 flag를 VM의 첫 번째 하드디스크(주로  첫 번째 디스크 = /dev/sda  )로 붙인다) 라는 의미이다. 즉, 실제 커널 안에서는

/dev/sda 라는 이름으로 첫번째로 붙게된다.

따라서 다음과 같이 데이터를 가져오던가,

Shell
dd if=/dev/sda bs=4096 count=16 2>/dev/null | hexdump -C | head

아니면 다음과 같이 파일로 열어야 한다.

Shell
open("/dev/sda",O_RDWR);