기본적으로 커널 익스플로잇은 권한 상승(Privilege Escalation)을 목표로 한다.이 권한 상승을 하게 만드는 가장 중요한 함수가 prepare_kernel_cred(), commit_creds() 함수이다.각 함수를 알아보기에 앞서, 몇 가지 구조체들에 대
구조체를 정의할 시 바이트 패딩을 통해서 구조체의 크기가 실제 구조체 멤버변수들의 크기의 합 보다 더 커지는 경우가 있다.하지만 \_\_attribute\_\_((packed))를 선언하면 패딩 바이트가 없이 오직 멤버변수들로만 메모리가 구성된다.예제 코드를 통해 보자
Kernel base address 찾기/proc/kallsyms 참고Kernel module base address 찾기/sys/module/<module>/sections 참고지속적으로 업데이트 예정..
linux kernel에서의 virtual memory layouthttps://github.com/lorenzo-stoakes/linux-mm-notes/blob/master/virt_layout.md실제 virtual memory에서 physical mem
코드 분석 1. struct msg_msg 2. alloc_msg() struct msg_msg 를 할당해주는 함수이다. 내부적으로 kmalloc()을 사용하는 것을 볼 수 있다. kmalloc()으로 할당하는 크기는 sizeof(msg_msg) + len에 해당
SLUB에서의 heap hardening 기법 중 freelist hardening 에 대해 알아볼 것이다. SLUB의 경우, singly linked list (이면서 FIFO) 구조를 가지는 freelist를 가지고 있다. linux kernel의 경우에도 fr
heap spray를 하기 위한 방법 중 userfaultfd + setxattr를 사용하는 방법이 있다.이를 알아볼 것이다.리눅스 커널에서는 메모리를 할당할 때 실제로 해당 물리페이지가 사용되기 전까지 새로 할당하지 않는다.이 이유는 할당해 놓고 실제로 사용하지 않는
init script 안에서 위처럼 수정하면 된다. /, /etc/init.d 확인0: 제한 없음. /proc/kallsyms 등의 파일을 통해 모든 사용자가 커널 심볼 주소를 볼 수 있다.1: 커널 심볼 주소를 root 사용자만 볼 수 있다.2: 모든 사용자에게 커
https://blogs.oracle.com/linux/post/linux-slub-allocator-internals-and-debugging-1https://i.blackhat.com/USA-22/Thursday/US-22-WANG-Ret2page
사실 설명하는 것 보다 이 그림이 더 이해하는 데에 도움이 많이 될 듯.여러 가지 케이스 별로 어떻게 할당되는지가 나뉘게 되는데,기본적으로 메모리의 할당은 항상 active slab에서 이루어진다.per-cpu lockless freelist가 free object 를
함수 호출 전의 값이 함수 호출 후에도 유지되어야 하는 레지스터를 의미한다.함수 호출 전의 값이 함수 호출 후에 바뀔 수 있는 레지스터를 의미한다.entry_64.S에 존재하는 주석이다.r12 ~ r15, rbp, rbx 레지스터는 callee-preserved이고,
io_uring에 대해 공부하다가 struct iov_iter와 관련된 아는 내용이 없어서 이쪽을 찾아보기로 했다.리눅스에서는 일반적으로 read / write를 할 때 read/write(fd, buf, size); 의 형태로 호출한다.하지만 이 외에도 벡터 형태의
어쩌다 보니 (2) 부터 쓰게 되었는데.. SLUB allocator의 할당 해제 동작에 대해서 알아보자. 우선 kmemcachefree() 함수를 통해서 free()가 이루어지는데, 호출 순서는 kmemcachefree() -> slabfree() -> doslab
KPTI 자체는 알고 있다고 가정한다.ROP 기법을 이용한다는 것을 전제로 한다.KPTI가 활성화되면, 커널모드에서의 page table과 usermode에서의 page table은 서로 달라진다. 특히 PGD의 주소가 다르다.PGD의 주소는 CR3 레지스터에 저장되어
우선 UAF 취약점이 있다고 가정을 한다. read-only file write 사실상 Dirty Pipe 취약점(CVE 2022-0847)의 연장선에 해당한다고 봐도 될 것이다. UAF를 통해 만들어진 victim object가 할당된 pipe_buffer 배열을
modprobe_path가 항상 동작하는 것이 아니다. 이 경우에도
userspace에서 fault가 일어난 경우만 알아보자. page fault handler 호출 순서는 다음과 같다. handlepagefault() -> douseraddrfault() -> handlemmfault() -> handlemmfault() -> ha
Dirty Pagetable 기법에 대해 알아보자.간략하게 설명하면, cross-cache attack을 이용해서 pagetable을 원하는 victim object가 속한 page로 할당이 되도록 하는 방법이다.이렇게 되면, victim object를 이용해서 pag
pipe를 만드는 syscall이다.둘 다 공통적으로 do_pipe2()를 호출한다.두 syscall의 차이점은 flag를 인자로 주는지에 대한 여부 차이이다.\_\_do_pipe_flags() 함수를 통해 파이프를 생성한다.그 후, copy_to_user()를 통해
리눅스 태스크의 uid에 대해 정리해 볼 것이다.먼저 각각에 대해 알아보자.ruid : 프로세스를 실행시키는 real user ideuid : 프로세스 실행 시 실제로 영향을 끼치는 effective user id. ruid와 다를 수 있다.suid : uid를 저장하
iov_iter 구조체에 대해 한 번 정리해 보고자 한다.iov_iter를 본격적으로 설명해 보기 전에, 먼저 readv()에 대해서 설명할 필요가 있다.writev()도 물론 가능하지만, 편의상 readv()에 대해서만 알아보도록 하자.readv() syscall의