inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

리눅스 커널 해킹. A부터 Z까지

kernel ROP 기법

Target 작성 방법관련 문의드립니다

464

힙몬

작성한 질문수 2

0

안녕하세요,

제가 강의 들으면서 제 스스로 수업자료와 동일한 환경을 직접 구성해보고 있습니다. Linux kernel 5.4.80 버전을 사용해서 환경을 구성하였는데, exp 실행파일에서 root 권한으로 exploit이 되지 않는 현상이 있었습니다.

수업자료만 가지고 실습을 하면 정상적으로 exploit이 되었기 때문에, 제가 수업자료의 test.ko 와 init을 복사해서 qumu를 수행했을 때, 아래와 같은 에러 메시지가 나타나는 것을 확인했습니다.

[    2.726475] test: version magic '5.8.5 SMP mod_unload ' should be '5.4.80 SMP mod_unload '

insmod: can't insert 'test.ko': invalid module format

수업자료는 5.8.5 kernel 에서 test.ko가 빌드된 것으로 보이는데, 일단 로딩 문제도 있긴 하지만 제가 새롭게 구성한 환경인 5.4.80에서도 KASLR 우회가 잘 되어야 하는거 같은데, 혹시 해당 버전에서는 동작하지 않을 수 있나요?

모의해킹 시스템 해킹 linux

답변 3

0

김현우

안녕하세요.

저는 커널 옵션에 make defconfig 외에 별다른 옵션을 주지는 않았습니다.

혹시 사용하신 qemu script를 올려주시겠어요?

추가로, 커널 이미지를 직접 빌드하셨으면, exploit code 상에서 구한 커널 함수와 가젯들의 주소 및 offset이 달라집니다.

이 부분은 직접 디버깅하셔서 맞춰주셔야 합니다.

0

힙몬

답변 감사합니다. 

우선 5.8.5 소스코드를 다운받아 다시 테스트를 해보았는데, Panic이 발생하였습니다.

1. 테스트 환경 (5.8.5 소스코드 x86_64로 기본 빌드 + 수업교재의 rootfs.cpio 사용)

 -http://cdn.kernel.org/pub/linux/kernel/v5.x/

2. exp 수행했을 때, Kernel panic 로그 (맨 아래 붙였습니다)

3. 패닉 로그에 "superviosr read access in kernel mode" 가 보여서 SMAP가 적용된 상태인지 확인해봤는데, /proc/cpuinfo에는 smep 또는 smap가 보이지는 않았습니다 (수업자료 이미지로 확인했을 때도, 동일한 flag로 확인되었구요)

4. 5.8.5 소소코드 빌드 시, CONFIG 수정해줘야 하는 부분이 혹시 있나요?

/ $ ./exp

leak : 0xffffffffa74bb209

[    5.896325] BUG: kernel NULL pointer dereference, address: 0000000000000000

[    5.897225] #PF: supervisor read access in kernel mode

[    5.897539] #PF: error_code(0x0000) - not-present page

[    5.898110] PGD 1da27067 P4D 1da27067 PUD 1da26067 PMD 0

[    5.898984] Oops: 0000 [#1] SMP NOPTI

[    5.899711] CPU: 0 PID: 69 Comm: exp Tainted: G           O      5.8.5 #1

[    5.900061] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1ubuntu1 04/01/2014

[    5.900525] RIP: 0010:switch_task_namespaces+0x10/0x50

[    5.901016] Code: 00 4c 8b a0 78 06 00 00 eb c0 b8 ff ff ff ff eb dd 66 0f 1f 84 00 00 00 00 00 55 48 89 0

[    5.902367] RSP: 0018:ffff98de001a7e98 EFLAGS: 00000286

[    5.902768] RAX: ffffffffa748b070 RBX: ffffffffa748ae40 RCX: 0000000000000000

[    5.903156] RDX: 0000000000000000 RSI: 00007ffdfff7d588 RDI: 0000000000000000                                                                                                                                 [    5.903491] RBP: ffff98de001a7eb0 R08: 0000000000400bb4 R09: 0000000000000000

[    5.903998] R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000

[    5.904249] R13: 0000000000000008 R14: ffff98de001a7f10 R15: 00007ffdfff7d580

[    5.904748] FS:  000000000088f880(0000) GS:ffff91871f000000(0000) knlGS:0000000000000000

[    5.905241] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033

[    5.905768] CR2: 0000000000000000 CR3: 000000001da40000 CR4: 00000000000006f0

[    5.906326] Call Trace:

[    5.907305]  ? _copy_from_user+0x2c/0x60

[    5.908878]  ? test_write+0x32/0x50 [test]

[    5.909213]  ? vfs_write+0xc2/0x1f0

[    5.909424]  ? ksys_write+0x5a/0xd0

[    5.909670]  ? do_syscall_64+0x3e/0x70

[    5.909898]  ? entry_SYSCALL_64_after_hwframe+0x44/0xa9

[    5.910517] Modules linked in: test(O)

[    5.911133] CR2: 0000000000000000

[    5.911913] ---[ end trace 4920c48988b92863 ]---

[    5.912422] RIP: 0010:switch_task_namespaces+0x10/0x50

[    5.912836] Code: 00 4c 8b a0 78 06 00 00 eb c0 b8 ff ff ff ff eb dd 66 0f 1f 84 00 00 00 00 00 55 48 89 0

[    5.914237] RSP: 0018:ffff98de001a7e98 EFLAGS: 00000286

[    5.914993] RAX: ffffffffa748b070 RBX: ffffffffa748ae40 RCX: 0000000000000000

[    5.915562] RDX: 0000000000000000 RSI: 00007ffdfff7d588 RDI: 0000000000000000

[    5.915874] RBP: ffff98de001a7eb0 R08: 0000000000400bb4 R09: 0000000000000000

[    5.916158] R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000

[    5.916814] R13: 0000000000000008 R14: ffff98de001a7f10 R15: 00007ffdfff7d580

[    5.917550] FS:  000000000088f880(0000) GS:ffff91871f000000(0000) knlGS:0000000000000000

[    5.917881] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033

[    5.918605] CR2: 0000000000000000 CR3: 000000001da40000 CR4: 00000000000006f0

[    5.919259] Kernel panic - not syncing: Fatal exception

[    5.919966] Kernel Offset: 0x26400000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xfff)

[    5.920774] Rebooting in 1 seconds..

=======================

/ $ cat /proc/cpuinfo

processor       : 0

vendor_id       : AuthenticAMD

cpu family      : 6

model           : 6

model name      : QEMU Virtual CPU version 2.5+

stepping        : 3

cpu MHz         : 3407.985                                                                                                                                                                                       cache size      : 512 KB

physical id     : 0

siblings        : 1

core id         : 0

cpu cores       : 1

apicid          : 0

initial apicid  : 0

fpu             : yes

fpu_exception   : yes

cpuid level     : 13

wp              : yes                                                                                                                                                                                            flags           : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx lm nopl cpuid pni cx16 hypervisor lahf_lm svm 3dnowprefetch vmmcall

bugs            : fxsave_leak sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass

bogomips        : 6815.97

TLB size        : 1024 4K pages

clflush size    : 64

cache_alignment : 64

address sizes   : 40 bits physical, 48 bits virtual

power management:

0

김현우

안녕하세요.

해당 에러는 make를 진행한 커널 소스는 5.4.80 SMP 버전이지만, 제가 제공해드린 커널 이미지는 5.8.5 버전이기 때문에 발생하는 에러입니다.

5.8.5 버전의 커널 소스를 다운받고 빌드하신 뒤, 모듈을 컴파일하는 Makefile의 커널 소스 경로를 해당 경로로 바꿔주시면 에러는 해결이 됩니다.

만약 커널 소스를 다운받기 힘든 환경이라면, MODULE_INFO(vermagic,"5.4.80 SMP mod_unload " ); 매크로를 소스 하단에 추가하시면 해당 에러는 뜨지 않지만, 추천드리는 방법은 아닙니다. 

또, 버전과 상관없이 제공해드린 예제 코드는 KASLR을 우회할 수 있습니다. 만약 우회가 되지 않는다면 다시 질문을 남겨주세요.

감사합니다.

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

0

68

2

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

0

79

1

ppt자료 문의

0

104

2

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

0

131

1

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

0

175

2

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

0

211

1

CTF 참가 시 전문 분야

0

312

1

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

0

402

2

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

0

461

1

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

0

310

1

여전히 해결책 없는 build_result

0

423

1

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

0

602

1

build_result가 안보입니다

0

285

1

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

0

501

1

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

0

570

2

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

0

579

1

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

0

604

1

Kernel KPTI 적용시 영향?

0

652

1

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

0

878

2

Kernel UAF

0

646

1

디버깅 방법

0

929

3

강의 자료 문의

0

374

1

boot.sh 실행시

0

360

1

Kernel Debugging

0

410

1