[CTF] wtfCTF 2021 writeup
2021. 6. 6. 16:52
Hacking/CTF
MoM5m4g1c c파일과 nc 서버가 주어졌다. water 값을 바꿔서 gift.txt 파일을 읽도록 해야할 것이다. gets 입력 시 bof가 발생하므로 water 값을 0 아닌 값으로 바꿔주면 된다. 익스플로잇 water값 앞 까지(125byte 만큼)를 더미로 채우고, water 값을 변경하면 system 함수가 실행될 것이다. 대회 서버가 닫혀서 플래그 샷은 찍지 못하였다. k3Y 이 문제는 옛날에 pwnable.kr 에서 풀어본 문제와 상당히 유사하다. rand() 를 통해 얻은 값을 v5에 저장한다. key 를 입력받은 뒤 v4에 저장한다. v5와 v4를 비트 연산한 결과값이 -1393689906 일 경우 system 함수를 통해 "cat flag" 를 실행시킨다. rand() 함수의 경우 ..
[Heap exploitation] Fastbin dup
2021. 5. 11. 21:48
Hacking/Pwnable
Double Free Double Free는 해제된 힙 청크를 다시 해제할 때 발생하는 버그이다. 힙을 해제하면 bin이라는 연결 리스트에 추가되고, 이는 힙을 재할당할 때 참조된다. 해당 버그가 발생하면 연결 리스트에 중복된 힙 주소를 추가하기 때문에 두 개의 객체가 동일한 메모리를 사용할 수 있다. // gcc -o dfb2 dfb2.c #include int main() { char *ptr = malloc(32); // 0x602010 char *ptr2 = malloc(32); // 0x602040 free(ptr); free(ptr2); free(ptr); return 0; } Double Free를 발생시키는 코드이다. 모두 free 한 이후에 fastbin[1] 의 모습은 다음과 같다. p..
[Heap exploitation] Use After Free
2021. 5. 11. 20:45
Hacking/Pwnable
Use After Free 줄여서 UAF 라고 부른다. UAF 는 메모리 영역을 free 한 후에 재사용하게 될 경우를 말한다. #include #include int main(void) { int* heap1; int* heap2; int* heap3; heap1 = (int*)malloc(256); heap2 = (int*)malloc(256); printf("heap1 : %p\n",heap1); printf("heap2 : %p\n",heap2); *heap2 = 1234; printf("heap2 number : %d\n",*heap2); free(heap2); printf("free heap2\n"); heap3 = (int*)malloc(256); printf("new heap : %p\n"..
[Heap exploitation] Heap Overflow
2021. 5. 8. 14:11
Hacking/Pwnable
Heap Overflow #include #include int main(void) { FILE* fd = fopen("secret","r"); char* input = malloc(40); char* secret = malloc(40); fread(secret, 1, 40, fd); fclose(fd); read(0, input, 100); // Overflow! printf("%s\n", input); } 두 개의 heap 메모리인 input 과 secret 을 할당한 뒤, secret 파일을 읽어서 두번째로 할당했던 secret 영역에 저장한다. 그 후 input 영역에 입력 값을 받고 출력시켜주는 코드이다. 이때 read 함수에서 취약점이 터진다. input 으로 할당한 메모리 크기는 40 바이트..
[Pwnable] Heap3
2021. 5. 6. 01:17
Hacking/Pwnable
Free free chunk는 bin이라는 freelist 구조체를 통해 관리 * freelist: 동적으로 메모리를 할당하고 해제할 때 메모리 관리의 효율을 높이기 위해 할당되지 않은 영역을 관리하는 연결 리스트 메모리 해제 : 해제하려는 영역을 freelist에 추가 / 메모리 할당 : freelist에 추가된 영역을 제거하고 해당 영역을 사용 -> 할당자는 할당 요청을 충족시키기 위해 적합한 청크를 bins에서 신속하게 찾아서 재할당한다. -> bins의 종류에는 Fast bin, Small bin, Large bin, Unsorted bin이 있다. -> 이는 malloc_state구조체(Arena_Header)에서 확인 가능하다. malloc_state구조체(Arena_Header) struct..
[Pwnable] Heap2
2021. 5. 5. 22:09
Hacking/Pwnable
Chunk Malloc에 메모리 할당을 요청하면 넓은 메모리의 영역("힙")을 다양한 크기의 덩어리("chunk")로 나눈다. 32bit에서는 해당 청크가 8byte 단위로 할당이 되고, 64bit에서는 16byte 단위로 할당된다. 일반적으로 malloc()을 호출하고 반환되는 주소를 이용하여 데이터를 입력하게 되는데, 사실 반환되는 주소는 청크의 시작부분이 아닌 페이로드의 주소이다. 페이로드바로 위에 meta-data를 포함하는 청크 헤더가 존재한다. 이 헤더에서 현재 청크의 사이즈가 몇인지, 인접한 청크의 사이즈는 얼마인지가 들어있다. Chunk는 크게 3가지 타입을 가진다. - In-use chunk : 애플리케이션에서 할당받아서 사용중인 덩어리 - Free chunk : 응용프로그램에서 시스템에..
[Pwnable] Heap1
2021. 5. 5. 17:18
Hacking/Pwnable
Memory Allocator 힙 익스플로잇을 구현하기 위해서는 메모리 관리를 위해 사용되는 Allocator에 대한 이해가 필요하다. - dlmalloc, ptmalloc2, jemalloc, tcmalloc, libumem, 등 다양한 종류의 메모리 할당자가 있다. 여기서는 GNU C Library의 메모리 할당자인 ptmalloc2에 대해 설명하겠다. - ptmalloc2는 dlmalloc 코드를 기반으로 하며 멀티 스레드에서 사용되도록 확장되었다. ptmalloc2 (2.23) ptmalloc2은 동일한 시간에 2개의 스레드가 malloc을 호출할 경우, 메모리는 각각의 스레드가 분배된 힙 영역을 일정하게 유지하고, 힙을 유지하기 위한 freelist data structures 또한 분배되어 있..
[P4C] pwnable problem writeup3
2021. 4. 29. 22:51
Hacking/Pwnable
팀원분들이 직접 제작하신 포너블 문제를 풀어보는 시간이다. (이번엔 재용님이 제작하신 문제들에 대한 롸업이다.) 1번 문제) 문제 이름을 입력받고, 멘트를 출력한다. scanf 로 입력받을 시 입력값 검증을 하지 않기에 bof 가 발생한다. -> ret 를 변경가능할 것이다. ret 를 ShowFlag() 로 변경해주면 될 듯하다. 익스플로잇 showFlag() 주소 : 0x400567 ret 까지의 offset : 72 byte payload 는 다음과 같을 것이다. "A"*72 + 0x400567 2번 문제) canary, nx, pie 모두 걸려있다..! aslr 은 꺼져있다. ID, PW 를 입력받고, 멘트를 출력한다. id, pw 를 버퍼 크기만큼만 입력받는다. s와 "admin" 을 비교한 결..