전체 글
-
CTF docker 세팅Tips 2020. 3. 14. 16:11
서버에 pwnable 문제를 올려 CTF를 진행할 때 참고하면 좋을 듯 하다. 먼저 pwnable 문제는 무조건 도커를 사용해 분리시켜둬야한다. 그래서 일단 docker와 docker-compose를 설치해준다. docker 설치 curl -fsSL https://get.docker.com/ | sudo sh docker-compose 설치 sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose 위 두개를 간단하게 설명하면 문제 하나하나 도커가 존재하는데, 그 도커들을 한번에 관리할 수 있게 도와주는 툴이..
-
feedme - DEFCON 2016Write-ups/CTFs 2020. 3. 1. 20:43
Prob Info 32bit 프로그램이며 NX만 활성화되어있다. Code static linked에 모두 스트립되어있어 함수를 잘 찾아줘야한다. 간단하게 start에서 시작해서 메인부터 찾아줬다. int __cdecl main(int argc, const char **argv, const char **envp) { signal(14, (int)sub_8048E24); alarm(150); setvbuf((unsigned int *)off_80EA4C0, 0, 2, 0); sub_804F820((int *)off_80EA4BC); sub_80490B0(); return 0; } 함수 인자보고 대충 예상해서 이름을 맞춰줬다. void sub_80490B0() { unsigned __int8 v0; // al..
-
glibc - ptmalloc (1)Heap exploitation/malloc 2020. 3. 1. 16:15
malloc()은 사용자가 프로그램 실행시 동적으로 메모리를 할당받을 수 있게 해주는 함수이다. 이는 내부적으로 sbrk()를 사용해 커널로부터 힙 영역을 할당받는데, sbrk()는 커널모드로 들어가기 때문에 단순히 요청한 크기만큼 sbrk()를 해주면 큰 부하가 걸린다. 이를 해결하기 위해 glibc는 ptmalloc을 사용하여 힙 영역을 관리한다. Arena arena란 힙 영역을 관리하는 구조체로, ptmalloc에서는 쓰레드별로 관리하여 main arena, thread arena가 존재한다. 단일 쓰레딩 환경에서는 main_arena만 존재한다. arena의 구조체는 아래와 같다. struct malloc_state { /* Serialize access. */ mutex_t mutex; /* ..
-
houseoforange - HITCON 2016Write-ups/CTFs 2020. 2. 27. 18:49
Prob Info 모든 보호기법이 걸려있다. 또한 이름에서 알 수 있듯이 House of Orange 문제이다. Code void __fastcall __noreturn main(__int64 a1, char **a2, char **a3) { signed int v3; // eax setup(); while ( 1 ) { while ( 1 ) { menu(); v3 = read_long(); if ( v3 != 2 ) break; see_house(); } if ( v3 > 2 ) { if ( v3 == 3 ) { upgrade_house(); } else { if ( v3 == 4 ) { puts("give up"); exit(0); } LABEL_14: puts("Invalid choice"); } ..
-
House of Orange - how2heapHeap exploitation/how2heap 2020. 2. 26. 13:59
Abstract House of Orange는 Fake _IO_FILE_plus를 만들고 IO_list_all를 수정한 후 의도적으로 힙에 손상을 일으켜 에러 메시지를 출력하게 한다. 이 때 abort.c 안의 _IO_flush_all_lockup()을 통해 에러 메시지를 출력시키는데, IO_list_all이 수정되었기에 fake _IO_FILE_plus를 실제 File Stream chain으로 인식한다. 이후 이에 대해 _IO_OVERFLOW()를 호출하게 되는데, fake _IO_FILE_plus의 vtable을 참조하기 때문에 RIP를 컨트롤할 수 있다. 말이 너무 길어졌는데, 순서대로 설명하면 아래와 같다. Exploit flow 적당히 큰 free된 청크를 만들기 위해 Top Chunk를 원래..
-
speedrun-009 - DEFCON 27Write-ups/CTFs 2020. 2. 22. 14:52
Prob Info 모든 보호기법이 켜져있다. Code void __fastcall __noreturn main(__int64 a1, char **a2, char **a3) { setvbuf(stdout, 0LL, 2, 0LL); if ( !getenv("DEBUG") ) alarm(5u); banner(); vuln(); finish(); exit(0); } "DEBUG"라는 환경변수가 있으면 5초 알람을 설정하지 않는다. 시작, 종료 배너를 출력해주고 그 사이에 실제 취약한 함수가 존재한다. unsigned __int64 vuln() { char buf; // [rsp+7h] [rbp-4E9h] ssize_t v2; // [rsp+8h] [rbp-4E8h] char s; // [rsp+10h] [rbp..
-
fastbin_dup_consolidate - how2heapHeap exploitation/how2heap 2020. 2. 17. 21:20
Abstract fast chunk와 large chunk를 이용한 fastbin_dup 기법이다. 이름대로 청크 병합을 할 때 발생하는 취약점인데, 힙에서 병합이 일어나는 경우는 아래 두가지가 있다. prev_inuse비트가 해제된 청크를 해제했을 때 prev chunk와 병합 혹은 prev_inuse 비트가 해제된 청크의 앞으로 두번째 청크가 해제했을 때 그 뒤 청크와 병합한다. (해제하는 청크의 앞 혹은 뒤 청크가 해제된 경우) large chunk를 할당했을 때 fastbin chunk와 인접해있는 경우 fastbin chunk와 병합한다. 위 2번째 상황에서 large chunk와 fastbin chunk가 인접해있지 않은 경우 fastbin chunk를 smallbin으로 이동한다 → fast..
-
fastbin_dup_into_stack - how2heapHeap exploitation/how2heap 2020. 2. 17. 20:53
Abstract fastbin_dup을 응용한 기법이다. fastbin_dup를 응용한 기법이다. fastbin_dup과의 차이점은 double-free를 한 후 다시 첫번째, 두번째 청크를 할당하고 첫번째 청크의 fd값을 stack의 주소(여기서는 stack이라 했지만 할당을 원하는 주소)로 변경해주는 것이다. fd값을 변경한 후 다시 같은 크기의 청크를 요청하면 stack의 주소를 리턴해준다. 주의점: fastbin에서 재할당을 할 때는 청크의 사이즈가 요청한 사이즈와 같은지 확인한다. 그래서 변경한 fd값 + 0x8(64bit 기준)의 주소에 청크 사이즈가 저장되어 있어야 한다. 청크의 사이즈는 4바이트만 검사하기 때문에 하위 4바이트만 크기를 맞춰주면 된다. Exploit Flow 동일한 크기의 ..