컨트롤 레지스터는 일반적인 동작을 변경하거나 제어하는 레지스터다.
인터럽트 제어나, 페이징 제어 등을 예로 들 수 있다.
64비트에선 CR0
~ CR4
에 CR8
이 추가적으로 존재한다고 한다.
CR0
~ CR4
중에서도 CR4
레지스터는 프로세스에서 지원하는 각종 확장 기능들을 제어한다.
SMEP
, SMAP
도 제어한다.
이 비트를 건드려서, SMEP
나 SMAP
를 우회할 수 있다.
일부러 커널 패닉을 일으키면 CR4
레지스터의 값을 확인할 수 있다.
/ $ ./cr4_check
[ 5.054479] arr : 0
[ 5.054843] general protection fault: 0000 [#1] SMP NOPTI
[ 5.055286] CPU: 0 PID: 69 Comm: cr4_check Tainted: G O 5.8.5 #2
[ 5.055600] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1ubuntu1.1 04/01/2014
[ 5.055909] RIP: 0010:0x4141414141414141
[ 5.056048] Code: Bad RIP value.
[ 5.056180] RSP: 0018:ffffc9000019fed8 EFLAGS: 00000246
[ 5.056255] RAX: 0000000000000000 RBX: 4141414141414141 RCX: 0000000020727261
[ 5.056390] RDX: 4141414141414141 RSI: ffffffff82b12ba0 RDI: ffffffff82b12fa0
[ 5.056464] RBP: 4141414141414141 R08: 0000000030203a20 R09: 0000000000028900
[ 5.056586] R10: 4141414141414141 R11: 0000000000000045 R12: 4141414141414141
[ 5.056701] R13: ffffc9000019ff10 R14: 00007ffda3974980 R15: 0000000000000000
[ 5.056898] FS: 000000000188f880(0000) GS:ffff88801f000000(0000) knlGS:0000000000000000
[ 5.057064] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 5.057206] CR2: 000000000045a780 CR3: 000000001da36000 CR4: 00000000001006f0
[ 5.057379] Call Trace:
[ 5.057884] ? ksys_write+0x9c/0xd0
[ 5.057944] ? do_syscall_64+0x3e/0x70
[ 5.058028] ? entry_SYSCALL_64_after_hwframe+0x44/0xa9
[ 5.058196] Modules linked in: test(O)
[ 5.058730] ---[ end trace 75bee9a911ca4f5a ]---
[ 5.058824] RIP: 0010:0x4141414141414141
[ 5.059045] Code: Bad RIP value.
[ 5.059226] RSP: 0018:ffffc9000019fed8 EFLAGS: 00000246
[ 5.059304] RAX: 0000000000000000 RBX: 4141414141414141 RCX: 0000000020727261
[ 5.059392] RDX: 4141414141414141 RSI: ffffffff82b12ba0 RDI: ffffffff82b12fa0
[ 5.059495] RBP: 4141414141414141 R08: 0000000030203a20 R09: 0000000000028900
[ 5.059573] R10: 4141414141414141 R11: 0000000000000045 R12: 4141414141414141
[ 5.059821] R13: ffffc9000019ff10 R14: 00007ffda3974980 R15: 0000000000000000
[ 5.060080] FS: 000000000188f880(0000) GS:ffff88801f000000(0000) knlGS:0000000000000000
[ 5.060342] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 5.060408] CR2: 000000000045a780 CR3: 000000001da36000 CR4: 00000000001006f0
[ 5.060682] Kernel panic - not syncing: Fatal exception
[ 5.061057] Kernel Offset: disabled
[ 5.061220] ---[ end Kernel panic - not syncing: Fatal exception ]---