inflearn logo
강의

Course

Instructor

Linux Kernel Hacking: A to Z

Kernel KPTI 적용시 영향?

Resolved

655

bioloidgp

1 asked

0

 

/mnt/c/Users/msh/Desktop/stack_based_BOF 1m 26s
❯ grep ": mov rdi, rax ; rep" ./gadgets.txt
0xffffffff8145a958 : mov rdi, rax ; rep movsb byte ptr [rdi], byte ptr [rsi] ; jmp 0xffffffff8145a368
0xffffffff814747df : mov rdi, rax ; rep movsb byte ptr [rdi], byte ptr [rsi] ; jmp 0xffffffff81474961
0xffffffff81479c79 : mov rdi, rax ; rep movsb byte ptr [rdi], byte ptr [rsi] ; jmp 0xffffffff81479cd8
0xffffffff8150a792 : mov rdi, rax ; rep movsb byte ptr [rdi], byte ptr [rsi] ; jmp 0xffffffff8150a391
0xffffffff81b08ab4 : mov rdi, rax ; rep movsb byte ptr [rdi], byte ptr [rsi] ; jmp 0xffffffff81b08a75
0xffffffff82a213e5 : mov rdi, rax ; rep movsb byte ptr [rdi], byte ptr [rsi] ; jmp 0xffffffff82a212b9
0xffffffff82a48d7c : mov rdi, rax ; rep movsb byte ptr [rdi], byte ptr [rsi] ; jmp 0xffffffff82a48d92
0xffffffff81b098e6 : mov rdi, rax ; rep movsb byte ptr [rdi], byte ptr [rsi] ; pop rbx ; pop rbp ; ret
0xffffffff82a081f0 : mov rdi, rax ; rep movsd dword ptr [rdi], dword ptr [rsi] ; ret
0xffffffff81132ad8 : mov rdi, rax ; rep movsq qword ptr [rdi], qword ptr [rsi] ; jmp 0xffffffff81132970
0xffffffff81b2413b : mov rdi, rax ; rep movsq qword ptr [rdi], qword ptr [rsi] ; ret
gef➤  x/10xi 0xffffffff82a081f0
   0xffffffff82a081f0:  Cannot access memory at address 0xffffffff82a081f0
gef➤  x/10xi 0xffffffff81132ad8
   0xffffffff81132ad8:  mov    rdi,rax
   0xffffffff81132adb:  rep movs QWORD PTR es:[rdi],QWORD PTR ds:[rsi]
   0xffffffff81132ade:  jmp    0xffffffff81132970
   0xffffffff81132ae3:  call   0xffffffff81b26270
   0xffffffff81132ae8:  nop    DWORD PTR [rax+rax*1+0x0]
   0xffffffff81132af0:  push   r15
   0xffffffff81132af2:  push   r14
   0xffffffff81132af4:  push   r13
   0xffffffff81132af6:  mov    r13,rdi
   0xffffffff81132af9:  push   r12

KPTI가 적용된 커널에서 일부는 주소를 찾아도 gdb로 확인을 할 수 없는데, 왜 그런건가요?

user level에서 page table이 줄어들어서 특정 부분이 빠지다보니, 그 가젯이 있는 부분도 빠져서 안보이는거 같은데, 약간 이상한거같습니다.

[ Legend: Modified register | Code | Heap | Stack | String ]
───────────────────────────────────────────────────────────────────────────────────────────────────────── registers ────
$rax   : 0xffffffff81b2c390
$rbx   : 0x0
$rcx   : 0x0
$rdx   : 0x22a
$rsp   : 0xffffffff82403eb0
$rbp   : 0x0
$rsi   : 0x83
$rdi   : 0x0
$rip   : 0xffffffff81b2c3ae
$r8    : 0xffff88801f01dec0
$r9    : 0x200
$r10   : 0x0
$r11   : 0x2f7
$r12   : 0x0
$r13   : 0x0
$r14   : 0x0
$r15   : 0x0
$eflags: [ZERO carry PARITY adjust sign trap INTERRUPT direction overflow resume virtualx86 identification]
$cs: 0x10 $ss: 0x18 $ds: 0x00 $es: 0x00 $fs: 0x00 $gs: 0x00
───────────────────────────────────────────────────────────────────────────────────────────────────────────── stack ────
[!] Unmapped address: '0xffffffff82403eb0'
─────────────────────────────────────────────────────────────────────────────────────────────────────── code:x86:64 ────
   0xffffffff81b2c3a5                  verw   WORD PTR [rip+0x4d94d6]        # 0xffffffff82005882
   0xffffffff81b2c3ac                  sti
   0xffffffff81b2c3ad                  hlt
 → 0xffffffff81b2c3ae                  mov    ebp, DWORD PTR gs:[rip+0x7e4e4fab]        # 0x11360
   0xffffffff81b2c3b5                  nop    DWORD PTR [rax+rax*1+0x0]
   0xffffffff81b2c3ba                  pop    rbx
   0xffffffff81b2c3bb                  pop    rbp
   0xffffffff81b2c3bc                  pop    r12
   0xffffffff81b2c3be                  ret
─────────────────────────────────────────────────────────────────────────────────────────────────────────── threads ────
[#0] Id 1, stopped 0xffffffff81b2c3ae in ?? (), reason: SIGINT
───────────────────────────────────────────────────────────────────────────────────────────────────────────── trace ────
[#0] 0xffffffff81b2c3ae → mov ebp, DWORD PTR gs:[rip+0x7e4e4fab]        # 0x11360
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
gef➤  x/10xi 0xffffffff82a081f0
   0xffffffff82a081f0:  Cannot access memory at address 0xffffffff82a081f0

혹시 몰라서 qemu script에서 qemu64로 바꿔서 kpti를 끄고 gdb를 달아서 테스트를 해봤더니, 이상하게 나오네요.

$r12   : 0x0
$r13   : 0x0
$r14   : 0x0
$r15   : 0x0
$eflags: [ZERO carry PARITY adjust sign trap INTERRUPT direction overflow resume virtualx86 identification]
$cs: 0x10 $ss: 0x18 $ds: 0x00 $es: 0x00 $fs: 0x00 $gs: 0x00
───────────────────────────────────────────────────────────────────────────────────────────────────────────── stack ────
[!] Unmapped address: '0xffffffff82403eb0'
─────────────────────────────────────────────────────────────────────────────────────────────────────── code:x86:64 ────
   0xffffffff81b2c3a5                  verw   WORD PTR [rip+0x4d94d6]        # 0xffffffff82005882
   0xffffffff81b2c3ac                  sti
   0xffffffff81b2c3ad                  hlt
 → 0xffffffff81b2c3ae                  mov    ebp, DWORD PTR gs:[rip+0x7e4e4fab]        # 0x11360
   0xffffffff81b2c3b5                  data16 data16 data16 xchg ax, ax
   0xffffffff81b2c3ba                  pop    rbx
   0xffffffff81b2c3bb                  pop    rbp
   0xffffffff81b2c3bc                  pop    r12
   0xffffffff81b2c3be                  ret
─────────────────────────────────────────────────────────────────────────────────────────────────────────── threads ────
[#0] Id 1, stopped 0xffffffff81b2c3ae in ?? (), reason: SIGINT
───────────────────────────────────────────────────────────────────────────────────────────────────────────── trace ────
[#0] 0xffffffff81b2c3ae → mov ebp, DWORD PTR gs:[rip+0x7e4e4fab]        # 0x11360
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
gef➤  x/10xi 0xffffffff82a081f0
   0xffffffff82a081f0:  int3
   0xffffffff82a081f1:  int3
   0xffffffff82a081f2:  int3
   0xffffffff82a081f3:  int3
   0xffffffff82a081f4:  int3
   0xffffffff82a081f5:  int3
   0xffffffff82a081f6:  int3
   0xffffffff82a081f7:  int3
   0xffffffff82a081f8:  int3
   0xffffffff82a081f9:  int3
gef➤

vmlinux를 잘못 추출한건가 싶어서 다시 추출해봤는데도 이상합니다.

모의해킹 linux 시스템-해킹 시스템 해킹 커널 모의해킹

Answer 1

1

v4bel

안녕하세요.

리눅스 커널 이미지는 런타임에서 command-line parameter 등에 의해 그 구조가 바뀔 수 있습니다.

KPTI를 적용하고 부팅한 커널에선, 커널 모드와 유저 모드로 전환하는 함수들의 흐름이 바뀌기도 하구요.

이런 경우엔 그냥 살아있는 가젯을 사용하거나, gdb의 find 명령어로 런타임에서 가젯을 찾는 것이 가장 간편한 방법입니다.

0

bioloidgp

감사합니다

강의 들으며 정리한 글을 블로그에 공개로 올려도 될까요?

0

73

2

cred 구조체에 __randomize_layout이 적용된건가요?

0

81

1

ppt자료 문의

0

106

2

빌드환경 및 커널소스의 버전

0

134

1

Stack based BOF 강의에서 질문입니다.

0

178

2

kaslr 우회 기법에서 commit_creds, prepare_kernel_cred의 offset을 구하는 과정 질문

0

215

1

CTF 참가 시 전문 분야

0

314

1

SMAP 우회에서 궁금한게 하나 있습니다.

0

404

2

KADR 우회에서 init파일이 없는 경우는 어떻게 하나요?

0

463

1

KADR 우회에서 init파일이 없는 경우는 어떻게 하나요

0

312

1

여전히 해결책 없는 build_result

0

426

1

KASLR 강의에서 주어진 환경에서는 /proc/kallsyms 확인 못하는 것이 맞나요?

0

605

1

build_result가 안보입니다

0

287

1

kernel stack pivoting에서 gadget 관련 질문드립니다.

0

504

1

안녕하세요 수강중 궁금한 것이 있습니다.

0

572

2

pwndbg가 커널에 attach는 되는데 디스어셈코드나 레지스터 표시가 안됩니다.

0

581

1

가젯에 대해 이해가 잘 안됩니다.

0

606

1

qemu 스크립트 실행시 Kernel panic이 발생합니다.

0

880

2

Kernel UAF

0

649

1

디버깅 방법

0

931

3

강의 자료 문의

0

377

1

boot.sh 실행시

0

363

1

Kernel Debugging

0

412

1

./boot_sh를 통해 qemu-script 실행 시 커널 실행이 안됩니다.

0

375

3