Linux kernel x86_64 in the sandbox

Overview

λ¦¬λˆ…μŠ€ 컀널 μ†ŒμŠ€λ₯Ό ν΄λ‘ ν•˜κ³ , μ‘μš©ν”„λ‘œκ·Έλž¨ 닀루듯이 마음껏 λ½€κ°œλ„λ‘,

User mode linux λΌλŠ” feature λ₯Ό μ‚¬μš©ν•˜λ €κ³  ν•©λ‹ˆλ‹€.

User mode Linux

λ¦¬λˆ…μŠ€ 컀널 μ†ŒμŠ€ μ½”λ“œλ₯Ό ν΄λ‘ ν•©λ‹ˆλ‹€.

버전 선택은 λ§ˆμŒλŒ€λ‘œ ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.

μ €λŠ” LTS λ˜λŠ” SLTS λ₯Ό 더 μ„ ν˜Έν•©λ‹ˆλ‹€.

Github λ ˆν¬μ§€ν† λ¦¬κ°€ μ•„λ‹ˆλΌ

kernel.org Git μ—μ„œ ν΄λ‘ ν•˜λŠ” μ΄μœ λŠ” λ§ˆμ΄λ„ˆ λ¦΄λ¦¬μ¦ˆμ— λŒ€ν•œ 컀밋도 λ“€μ–΄κ°€κΈ° λ•Œλ¬Έμ—,

ν•΄λ‹Ή λ¦΄λ¦¬μ¦ˆμ— μ΅œμ‹  λ³€κ²½ 사항을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

Linux kernel source clone

1
2
3
4
5
git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

# 5.10.x latest (SLTS)
git tag | grep "5.10."
git checkout 5.10.19

λΉŒλ“œν•  λ•Œ νŠΉλ³„νžˆ μ„€μ • ν•΄μ£ΌλŠ” ν”Œλž˜κ·Έμž…λ‹ˆλ‹€.

Setup build flags

1
2
3
4
5
6
7
8
# arch setup & debug symbol

$ cat > set.sh
export CFLAGS="-g -Wall -Wextra"
export ARCH=um 
export SUBARCH=x86_64 # arch/arm64/Makefile.um X arm64 μ•ˆλ¨ :( export SUBARCH=arm64
# ctrl + d
$ source set.sh

이제 λΉŒλ“œλ₯Ό ν•΄λ΄…μ‹œλ‹€.

config & compile 1

1
2
# make default config
make defconfig

μ—¬κΈ°μ„œ 잠깐, μš°λ¦¬λŠ” μ—΄μ‹¬νžˆ λ¦¬λˆ…μŠ€ 컀널을 ν•΄ν‚Ήν• κ²ƒμ΄λ―€λ‘œ

고전적인 DDDλ‚˜ Insightλ₯Ό μ‚¬μš©ν•΄μ„œ λ””λ²„κΉ…ν•˜λŠ” 것도 κ°€λŠ₯ν•©λ‹ˆλ‹€.

μ΅œκ·Όμ—λ„ κ³„μ†ν•΄μ„œ 릴리즈 ν•˜κ³  μžˆλŠ”

  • KDE 기반의 KDbg

  • 파이썬 기반의 μ›Ή GUI 둜 μ‚¬μš©ν•˜λŠ” gdbgui

  • VSCode GDB 연동 ν”ŒλŸ¬κ·ΈμΈ

선택지가 λ§Žλ„€μš”.

μ•„λ¬΄νŠΌ μ•„λž˜μ˜ μΆ”κ°€ 섀정을 ν•΄μ€μ‹œλ‹€!

컀널을 직접 λΉŒλ“œν•˜λŠ” κ²½μš°μ— 디버깅이 κ°€λŠ₯ν•˜κ²Œ ν•˜λ €λ©΄ λ‹€μŒ μ˜΅μ…˜μ„ μ„ νƒν•˜λ©΄ λ©λ‹ˆλ‹€.

Kernel Hacking
    ->Compile the kernel with frame pointers - Enable
    ->Show command line arguments on the host in TT mode - Disable

또 λ¦¬λˆ…μŠ€ μ»€λ„μ˜ lock 을 디버깅1 ν•˜κΈ° μœ„ν•΄μ„œ μ„€μ •ν•  수 μžˆλŠ” 뢀뢄이 μžˆμŠ΅λ‹ˆλ‹€.

config & compile +Ξ±

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# make default config
 sudo apt install -y libncurses-dev

 make menuconfig

 .config - Linux/x86 5.10.18 Kernel Configuration
 ─────────────────────────────────────────────────────────────────────────────────
  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ Linux/x86 5.10.18 Kernel Configuration ──────────────────┐
  β”‚  Arrow keys navigate the menu.  <Enter> selects submenus ---> (or empty    β”‚
  β”‚  submenus ----).  Highlighted letters are hotkeys.  Pressing <Y> includes, β”‚
  β”‚  <N> excludes, <M> modularizes features.  Press <Esc><Esc> to exit, <?>    β”‚
  β”‚  for Help, </> for Search.  Legend: [*] built-in  [ ] excluded  <M> module β”‚
  β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
  β”‚ β”‚        General setup  --->                                             β”‚ β”‚
  β”‚ β”‚    [*] 64-bit kernel                                                   β”‚ β”‚
  β”‚ β”‚        Processor type and features  --->                               β”‚ β”‚
  β”‚ β”‚        Power management and ACPI options  --->                         β”‚ β”‚
  β”‚ β”‚        Bus options (PCI etc.)  --->                                    β”‚ β”‚
  β”‚ β”‚        Binary Emulations  --->                                         β”‚ β”‚
  β”‚ β”‚        Firmware Drivers  --->                                          β”‚ β”‚
  β”‚ β”‚    [*] Virtualization (NEW)  --->                                      β”‚ β”‚
  β”‚ β”‚        General architecture-dependent options  --->                    β”‚ β”‚
  β”‚ β”‚    [*] Enable loadable module support  --->                            β”‚ β”‚
  β”‚ β”‚    -*- Enable the block layer  --->                                    β”‚ β”‚
  β”‚ β”‚        IO Schedulers  --->                                             β”‚ β”‚
  β”‚ β”‚        Executable file formats  --->                                   β”‚ β”‚
  β”‚ β”‚        Memory Management options  --->                                 β”‚ β”‚
  β”‚ β”‚    [*] Networking support  --->                                        β”‚ β”‚
  β”‚ β”‚        Device Drivers  --->                                            β”‚ β”‚
  β”‚ β”‚        File systems  --->                                              β”‚ β”‚
  β”‚ β”‚        Security options  --->                                          β”‚ β”‚
  β”‚ β”‚    -*- Cryptographic API  --->                                         β”‚ β”‚
  β”‚ β”‚        Library routines  --->                                          β”‚ β”‚
  β”‚ β”‚        Kernel hacking  --->                                            β”‚ β”‚
  β”‚ β”‚                                                                        β”‚ β”‚
  β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
  β”‚          <Select>    < Exit >    < Help >    < Save >    < Load >          β”‚
  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

 # μ•„λž˜μ˜ ν•­λͺ©λ“€ 쀑 해킹을 μœ„ν•΄μ„œ ν•„μš”ν•œ ν•­λͺ©μ„ μ„ νƒν•˜μž 
 # TODO: 각 ν•­λͺ©μ΄ μ–΄λ–€ κΈ°λŠ₯을 ν•˜λŠ”μ§€ ꡬ체적으둜 쑰사가 ν•„μš”ν•¨

  β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
  β”‚ β”‚        printk and dmesg options  --->                                  β”‚ β”‚
  β”‚ β”‚        Compile-time checks and compiler options  --->                  β”‚ β”‚
  β”‚ β”‚        Generic Kernel Debugging Instruments  --->                      β”‚ β”‚
  β”‚ β”‚    [*] Kernel debugging                                                β”‚ β”‚
  β”‚ β”‚    [*]   Miscellaneous debug code                                      β”‚ β”‚
  β”‚ β”‚        Memory Debugging  --->                                          β”‚ β”‚
  β”‚ β”‚    [ ] Debug shared IRQ handlers                                       β”‚ β”‚
  β”‚ β”‚        Debug Oops, Lockups and Hangs  --->                             β”‚ β”‚
  β”‚ β”‚        Scheduler Debugging  --->                                       β”‚ β”‚
  β”‚ β”‚    [ ] Enable extra timekeeping sanity checking                        β”‚ β”‚
  β”‚ β”‚        Lock Debugging (spinlocks, mutexes, etc...)  --->               β”‚ β”‚
  β”‚ β”‚    -*- Stack backtrace support                                         β”‚ β”‚
  β”‚ β”‚    [ ] Warn for all uses of unseeded randomness                        β”‚ β”‚
  β”‚ β”‚    [ ] kobject debugging                                               β”‚ β”‚
  β”‚ β”‚        Debug kernel data structures  --->                              β”‚ β”‚
  β”‚ β”‚    [ ] Debug credential management                                     β”‚ β”‚
  β”‚ β”‚        RCU Debugging  --->                                             β”‚ β”‚
  β”‚ β”‚    [ ] Force round-robin CPU selection for unbound work items          β”‚ β”‚
  β”‚ β”‚    [ ] Force extended block device numbers and spread them             β”‚ β”‚
  β”‚ β”‚    [ ] Latency measuring infrastructure                                β”‚ β”‚
  β”‚ β”‚    [*] Tracers  --->                                                   β”‚ β”‚
  β”‚ β”‚    [ ] Sample kernel code  ----                                        β”‚ β”‚
  β”‚ β”‚    [*] Filter access to /dev/mem (NEW)                                 β”‚ β”‚
  β”‚ β”‚    [ ]   Filter I/O access to /dev/mem (NEW)                           β”‚ β”‚
  β”‚ β”‚        x86 Debugging  --->                                             β”‚ β”‚
  β”‚ β”‚        Kernel Testing and Coverage  --->                               β”‚ β”‚
  β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚

config & compile 2

1
2
# make user mode linux
make -j8 linux

루트 νŒŒμΌμ‹œμŠ€ν…œμ„ 마운트 ν•©λ‹ˆλ‹€.
μ €λŠ” 보톡 μ†ŒμŠ€ 디렉토리에 ν•΄λ†“μŠ΅λ‹ˆλ‹€.

root file system mount

1
2
3
4
sudo apt -y install supermin

supermin -v --prepare bash coreutils -o $PWD/rootfs.template
supermin -v --build --format chroot rootfs.template -o $PWD/rootfs

λ§ˆμ§€λ§‰μœΌλ‘œ λ§ˆμš΄νŠΈν•œ κ²½λ‘œμ— 슀크립트λ₯Ό μž‘μ„±ν•˜κ³ ,

rootfs/boot/boot.sh

1
2
3
4
#!/bin/bash
mount -t sysfs /sys /sys
mount -t proc /proc /proc
exec /bin/bash

μ‹€ν–‰κΆŒν•œμ„ λ³€κ²½ν•˜λ©΄ μ§€λ£¨ν•œ 섀정은 λλ‚¬μŠ΅λ‹ˆλ‹€!

chmod

1
chmod +x rootfs/boot/boot.sh

자 이제 user mode linux λ₯Ό μ‹€ν–‰ν•˜κ³  μ¦κ²¨λ΄…λ‹ˆλ‹€.

Have a lot of fun

1
./linux rootfstype=hostfs rootflags=$PWD/rootfs rw init=/boot/boot.sh

λ‹€μŒμ—λŠ” 컀널 μ†ŒμŠ€λ₯Ό Hack ν•œ λ‹€μŒ GDB TUI λͺ¨λ“œμ—μ„œ λ””λ²„κΉ…ν•˜λŠ” 과정을 μ‚΄νŽ΄λ΄…λ‹ˆλ‹€.


  1. λ¬ΈC λΈ”λ‘œκ·Έ lockdep link ↩︎