본문 바로가기

전체 글

(56)
[CISCN 2017] BabyDriver 리눅스 커널 모듈에서 발생하는 취약점을 exploit하는 문제이다. ioctl에서 원하는 크기의 청크를 할당할 수 있다. 이때 청크의 포인터는 전역변수에 등록된다. __int64 __fastcall babyioctl(file *filp, unsigned int command, unsigned __int64 arg) { size_t v3; // rdx size_t size; // rbx __int64 result; // rax _fentry__(); size = v3; if ( command == 0x10001 ) { kfree(babydev_struct.device_buf); babydev_struct.device_buf = (char *)_kmalloc(size, 0x24000C0LL); babydev..
window exploit basic 1 보호되어 있는 글입니다.
2019 defcon/ babyheap 전형적인 menu heap exploit 문제이다. 제공하는 기능은 다음과 같다. Malloc Free Show Exit 각각의 함수들은 전형적인 모습이고, Malloc함수 외에는 취약점이 터지는 부분이 없기 때문에 설명을 생략한다. 취약점은 Malloc에서 발생한다. 청크를 할당한 후 입력받을 때 한 글자씩 입력받는다. 이때 입력을 받은 후 size 체크를 하기 때문에 한 바이트를 더 입력할 수 있다. 따라서 off-by-one 취약점이 발생한다. signed __int64 add() { _QWORD *v0; // rax unsigned int i; // ebp __int64 size; // r12 __int64 j; // rbx __int64 *v4; // rbp char buf; // [rsp+7h..
calloc without memset 0 CTF에서 자주 나오는 glibc heap epxloit 문제에서 메모리를 할당하기 위하여 자주 사용되는 함수는 다음과 같다. malloc realloc calloc 이중 calloc은 메모리를 할당한 후 할당된 메모리를 0으로 초기화한다. 따라서 heap exploit을 할 때 중요한 정보를 leak하기 힘들어진다. 또한 청크를 할당받을 때 중요한 정보를 0으로 덮어버려 에러를 유발할 수 있다. 본 문서에서 이런 문제를 해결하기 위한 테크닉을 알아보자. 이 테크닉은 glibc 2.23, 2.27, 2.29에서 유효한 것을 확인하였다. glibc 2.29 버전의 소스코드를 보자. glibc-2.29/malloc/malloc.c:3472에 calloc에서 메모리를 0으로 초기화하는 코드가 있다. 이때 첫번..
glibc 2.29 tcache typedef struct tcache_entry { struct tcache_entry *next; /* This field exists to detect double frees. */ struct tcache_perthread_struct *key; } tcache_entry; /* There is one of these for each thread, which contains the per-thread cache (hence "tcache_perthread_struct"). Keeping overall size low is mildly important. Note that COUNTS and ENTRIES are redundant (we could have just counted the linked..
glibc 2.29 malloc 분석1. [청크, malloc] 보호되어 있는 글입니다.
34c3 / SimpleGC 바이너리 다운로드 링크 : https://34c3ctf.ccc.ac/uploads/SimpleGC-09f5d1286c83b34441568a645af12cd5.tar.gz libc-2.26.so, sgc를 준다. sgc에 적용된 보호기법을 확인해보았다. 감사하게도 PIE와 relro가 안 걸려 있다. sgc 바이너리를 리버싱하면 user과 user들이 속하는 group을 만들어 관리하는 프로그램임을 알 수 있다. 다만 while 문에 들어가서 전에 gc라는 thread를 실행한다. user 구조체과 group 구조체는 아래와 같다. 1 2 3 4 5 6 7 8 9 10 11 12 13 struct group { char *group_name; __int64 ref_count; }; struct user {..
HCTF 2019 Baby Shellcode elf 바이너리를 하나 준다. 어떠한 루틴을 거친 다음 우리가 입력한 쉘코드를 입력한다. 귀찮게 코드 읽지 않고 바로 인터넷에 있는 쉘코드를 넣어보았다. push를 실행할 때 크래시가 난다. 레지스터를 보면 보면 rsp가 0인 것을 확인할 수 있다. pop과 push가 수행될 때 rsp를 참조함으로 rsp가 유효한 주소를 가리키고 있지 않으면 에러가 난다. 우리가 입력한 쉘코드가 실행되기 전에 프로그램이 실행시키는 어떠한 코드가 있을 것이라고 판단해서 mmap된 영역의 코드를 확인해보았다. xor로 rip를 제외한 모든 레지스터를 0으로 초기화하는 것을 볼 수 있다. 따라서 우리는 rsp에 유효한(write권한이 있는) 주소값을 넣어준 후 일반적인 쉘코드를 띄워주면 된다. ri..