| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
- 공유기
- UART
- 익스플로잇
- Slab free list poisoning
- exploit
- protection ring
- mr 100
- System Management Mode
- tl mr 100
- Cross-cache attack
- 라우터
- memory
- e
- exit handler overwrite
- physmap
- ROP
- openwrt
- mips
- fini array
- kernel exploit
- Pwnable
- linux ring 권한 구조
- tp link
- Router
- SMM
- 커널
- hardware hakcing
- Kernel
- Today
- Total
목록Linux kernel (10)
haehet
이번 글에서는 kernel exploit을 할 때 강력한 primitive를 얻을 수 있는 Dirty Pagetable에 대해서 정리해보겠다. 1. page table이란? 멀티레벨페이징을 공부했다면 알겠지만 page table은 CPU가 가상주소(VA)를 물리주소(PA)로 변환할 때 쓰는 테이블이다. CR3레지스터를 통해 확인 가능하다. (여기서는 따로 이론적인 내용을 길게 설명 안하겠다.)page table은 항상 미리 다 만들어져 있는 게 아니라 Linux는 대부분의 매핑을 지연(lazy) 생성한다. 즉 실제 페이지테이블 엔트리는 첫 접근(page fault)가 발생하면서 할당되는 경우가 많다. Dirty Pagetable 기법은 이를 이용한다. 2. Dirty pagetableDirty page..
이번 글에서는 aaw primitive가 얻기 힘든상황에서 사용하기 좋은 slab free list poisoning에 대해서 정리해보겠다. 1. free free list의 구조 보통 ptmalloc 같은 userland의 free chunk 구조를 보면 청크 앞부분에 다음 freelist를 저장한다. 커널은 특이하게 중간 부분에 next pointer를 저장한다. 이는 작은 overflow로 캐시의 freelist가 조작되는 것을 막기 위함이다. 해당 내용은 calculate_sizes 함수에서 확인 가능하다. if ((flags & (SLAB_TYPESAFE_BY_RCU | SLAB_POISON)) || s->ctor || ((flags & SLAB_RED_ZONE) && (s->..
이번 글에서는 커널 익스플로잇을 할 때 유용하게 쓰이는 Cross-cache attack에 대해 정리 해보겠다. 1. Cross-Cache attack이란? Cross-Cache attack이란 취약점이 발생한 object가 전용 슬랩 캐시(dedicated kmem_cache)에 존재해서 exploit을 하기 어려울 때 우리가 공격하기 쉬운 캐시로 가져오는 것을 말한다. 다음과 같이 전용 슬랩 객체 A에서 UAF 취약점이 발생했다고 하자. A 객체만으로는 exploit을 하기가 힘들다. 따라서 Cross-Cache attack을 통해 exploit 하기 쉬운 객체 B를 불러온다. 이를 통해 다음과 같이 강력한 exploit primitive 불러 올 수 있다. Cross-cache attack의 ..
이번 글에서는 kernel exploit에서 기본지식이 되는 Slub allocator에 대해서 정리해보겠다.(틀린 내용이 있을 수도 있으니 양해 부탁드립니다..) 1. Slab allocator란? Slab allocator는 커널 영역의 메모리를 효율적으로 관리하기 메모리 할당기이다. 기존의 buddy system을 통한 메모리 관리는 2^n 단위로만 메모리를 할당 해 주기 때문에 내부 단편화가 생길 수 있다는 단점이 있었다. 이를 해결하기 위해 Slab allocator가 등장하였다. 시간이 흐르면서(그리고 수많은 커널 버전을 거치면서) 리눅스의 slab allocator는 발전했고 구조도 상당히 많이 바뀌었다. 현재까지 서로 다른 구현이 세 가지 존재한다. 이 글에서는 Slub allocat..
이번 글에서는 slub allocator에 대해 공부하기 전에 리눅스의 메모리 관리 시스템 중에서도 페이지 단위 물리 메모리 할당을 담당하는 Page Allocator를 먼저 정리해보겠다. (궁금한 내용을 인터넷에 돌아다니며 정리한 것이므로 틀린 내용이 있을 수도 있습니다.) 1. NUMA(Non-Uniform Memory Access)와 Zones, Free Lists NUMA란 멀티 프로세서 환경에서 적용되는 메모리 접근 방식이다. 멀티 프로세서 환경에서는 단일 버스를 공유하기 때문에 여러개의 CPU가 하나의 메모리에 접근 하게 되면 한개의 cpu를 제외하고 전부 block상태가 되어서 메모리 처리가 늦어지는 병목현상이 발생한다. NUMA는 이런 단점을 해결하였다. NUMA 시스템에서는 CPU를 몇..
이번 글에서는 뒤에서 공부할 buddy system이나 slub allocator에 앞서 리눅스 메모리 관리 이론 및 기본적인 것들을 정리해보겠다.1. Multi level paging Multi level paging이란 단일 페이지 테이블의 크기가 너무 커지는 문제를 해결하기 위해 페이지 테이블을 여러 단계로 나누어 관리하는 기술이다. x86-64에서 가상주소는 멀티레벨 페이지 테이블을 통해 물리주소로 변환된다. CPU는 CR3 레지스터에 저장된 최상위 페이지 테이블을 시작으로 PML4 → PDPT → PD → PT 순서로 내려가며 엔트리를 따라간다. 마지막 단계에서 얻는 정보(페이지 프레임 주소 + 권한 비트)를 이용해 최종 물리주소를 계산한다. CPU의 MMU(Memory Management ..
이번 글에서는 x86의 보호 링(Protection Ring) 구조를 정리하고 Ring -2에 있는 SMM(System Management Mode)에 대해 정리해보겠다. 1. 링 권한 구조 x86 아키텍처는 코드가 실행될 수 있는 권한 수준을 Protection Ring(Ring 0~3) 으로 나눠 관리한다. 숫자가 낮을수록 권한이 높고, 리눅스에서는 보통 다음처럼 사용한다.● Ring 3 (User mode): 일반 사용자 프로세스● Ring 0 (Kernel mode): 리눅스 커널유저 프로세스는 privileged instruction을 실행할 수 없고 커널 메모리에도 직접 접근할 수 없다. 커널 기능이 필요하면 시스템 콜을 통해 Ring 0 경계로 진입한다. 보통 Ring 0까지만 다루지만 더..
워게임 혹은 CTF 문제를 풀다 보면 취약한 PCI drvier를 주고 qemu를 escape하는 형식의 pwnable문제가 간혹 나온다. 이번 글에서는 PCI driver 환경에서 qemu escape를 하기 위해서 알아야 하는 MMIO와 PCI driver interface 등을 정리해보겠다. 1. ZONE리눅스 커널은 물리 메모리 전체를 ZONE이라는 단위로 나눠서 관리한다. 이는 하드웨어, 장치 제약, DMA 가능성 같은 기준에 따라 물리 메모리를 구분하기 위해서이다. ● ZONE_DMA, ZONE_DMA32: DMA 주소 폭 제약(16MiB/4GiB) 때문에 커널이 장치가 접근 가능한 저주소 RAM에서만 DMA 버퍼를 할당하도록 분리해 둔 메모리 존이다.● ZONE_NORMAL: 커널이 항상 ..
