Security/System Exploit
Poison null byte
Poison null byte
2017.08.15https://github.com/umbum/pwn/blob/master/how2heap/poison_null_byte.c malloc'ed region에 off-by-one error가 발생할 때, next chunk size의 LSB를 `` 0``으로 만들어 size를 속이는 방법.결과적으로 d chunk 내부에 b2 chunk가 위치하게 되므로 d chunk에 접근해 b2 chunk를 변경할 수 있다. null byte off-by-one error는 종종 발생하기 때문에 많은 경우에 사용할 수 있는 테크닉이라는 점은 장점. b2 chunk는 heap에만 존재할 수 있기 때문에 b2 chunk가 function pointer 등 유용한 데이터를 저장하고 있을 경우나, overlap을 이용한 leak..
overlapping chunk
overlapping chunk
2017.08.15overlap technique으로 fastbin attack을 이용해도 되겠지만, 이게 더 간단하다.Poison null byte와 동일하게 off-by-one error만 발생하는 환경에서도 사용할 수 있다. 다만 overflow 되는 것이 null byte 뿐 이라면 사용할 수 없으므로 이 경우 poison null byte를 사용해야 한다. Case 1https://github.com/shellphish/how2heap/blob/master/overlapping_chunks.c먼저 ``c free(chunk)``하고 `` chunk.size``를 변경1. free(p2) and then change p2.sizep1 prev_size 0x111 p2 prev_size0x111 → 0x1a1 p3p..
one_gadget / libc-database
one_gadget / libc-database
2017.08.13one_gadgetobjdump나, one_gadget으로 구한 offset은 library mapping 시작 주소에 +하면된다.constraints 를 확인한다. https://github.com/david942j/one_gadgethttps://david942j.blogspot.kr/2017/02/project-one-gadget-in-glibc.html 어떤 식으로 동작하는지 나와있다.```bashgem install one_gadget```one_gadget으로 나온 결과는 잘 되는지 꼭 테스트해봐야 한다. 에러가 발생하는 경우도 있기 때문.```bashjump *base+offset```바이너리가 컴파일된 시스템의 libc 버전과, 바이너리를 실행하는 현재 시스템의 libc 버전이 다른 경우o..
pwntools
pwntools
2017.08.13https://github.com/Gallopsled/pwntoolshttps://docs.pwntools.com/en/stable/intro.htmlhttps://docs.pwntools.com/en/stable/globals.htmlhttp://docs.pwntools.com/en/stable/tubes.html 32bit에서도 돌아가기는 하나 정식으로 지원하지는 않음.canary break같은 brute force는 threading이나 asyncio를 사용해야 하는데 threading의 경우 될 때도 있고 안될 때도 있음. 직접 짠건 잘 되는걸로 보아 시스템 상태에 더 민감하게 반응하는 듯? 그래서 이런 경우 직접 코딩하는게 낫다. debug 기능이 아주 이상하기 때문에 그냥 안쓰는게 낫다. ``..
Shellcode
Shellcode
2017.07.26http://shell-storm.org/shellcode/ NOP-like NOP는 다음과 같은 방식으로도 만들 수 있다.```cmov %eax, %eax``` #1 peda #2 pwntools #3 msf x86```cvoid main(){__asm__ __volatile__("xor %eax, %eax \n\t" 31 c0"push %eax \n\t" 50"push $0x... \n\t" 68 ..."mov %esp, %ebx \n\t" 89 e3"push %eax \n\t" 50"push %ebx \n\t" 53"mov %esp, %ecx \n\t" 89 e1"mov %eax, %edx \n\t" 89 c2"mov $0xb, %al \n\t" b0 0b"int $0x80 \n\t" cd 80);..
UAF, Use After Free
UAF, Use After Free
2017.07.23* Integer overflow와 연계해 reference counter를 overflow시켜 0으로 만들어 강제로 ``c free()``시키는 방법으로 사용할 수도 있다. #1``c free()``된 영역을 참조하는 경우.보통 ``c free()``하면 `` fd/bk/last_size`` 부분만 초기화되고 나머지 영역은 그대로 남아있기 때문에 나머지 영역에 있는 데이터를 leak할 수 있다.이 때 ``c puts()``같은 문자열 함수를 사용해 처음부터 출력하면 `` \x00``까지만 읽어 `` fd`` 첫 바이트가 `` \x00``인 경우 아무것도 출력되지 않으므로 주의.```cint main(){ void *old_p = malloc(32); void *new_p; strcpy(old_p, "a..
[glibc] free_hook, malloc_hook
[glibc] free_hook, malloc_hook
2017.07.23```cgdb-peda$ x/4wx &__free_hook0xf7fd08b0 : 0x00000000 gdb-peda$ patch 0xf7fd08b0 one_gadget_addr```32bit `` libc.so``의 경우 다음과 같이 `` unsorted_bin``에서 `` 0x10`` 단위로 조회하면 없는 것 처럼 나오는데, 이는 `` gdb``가 맨 왼쪽에 있는 symbol만 표시해주기 때문이다.```bashgdb-peda$ x/40wx 0xf7fad7b0 - 0x600xf7fad750: 0x00000000 0x00000000 0x00000000 0x000000000xf7fad760 : 0xf7e6cfa0 0xf7e6cf40 0x00000000 0x000000000xf7fad770: 0x0000000..
[glibc] malloc - checks
[glibc] malloc - checks
2017.07.22[malloc] fastbins size check [malloc] smallbins bk check & unlink [malloc] unsorted bin size check [malloc] unsorted bin unlink [free] MINSIZE check [free] invalid next size (fast) [free] double free check [free] invalid next size (normal) [free] unsorted bin link [realloc] unlink size vs. prev_size check [realloc] invalid next size
[glibc] malloc - 4
[glibc] malloc - 4
2017.07.21malloc sequence너무 큰 heap memory 할당을 요청하는 경우, ``c mmap()``을 사용해 아예 다른 곳에 공간을 할당한다. * mmap'ing threshold 값은 따로 설정되지 않은 경우 dynamic하게 결정된다. 보통은 대략 `` 0x20800`` 이상일 때. 요청에 맞는 fastbin에 chunk가 있는 경우 반환한다. 요청에 맞는 smallbin에 chunk가 있는 경우 반환한다. large bin size request일 경우, 모든 fastbins's chunks를 (적당히 합치면서) unsorted bin으로 옮긴다. ``c if (have_fastchunks (av)) malloc_consolidate (av);`` unsorted bin에 있는 chunk들을 (..
[glibc] malloc - 3
[glibc] malloc - 3
2017.07.21* ASLR is disabled application's initial heap프로그램이 ``c malloc()`` 등 직접 heap을 할당받는 코드를 실행하지 않더라도, 기본적으로 `` 0x21000``(132KB) 크기의 initial heap을 가지고 있으며 이 heap은 main_arena에 해당한다.```bash00400000-00401000 r-xp 00000000 08:01 1442324 /home/umbum/heap_study/no_malloc00600000-00601000 r--p 00000000 08:01 1442324 /home/umbum/heap_study/no_malloc00601000-00602000 rw-p 00001000 08:01 1442324 /home/umbum/hea..
[glibc] malloc - 2
[glibc] malloc - 2
2017.07.19circular doubly linked listfastbin을 제외한 나머지 bins는 circular doubly linked list 구조를 사용한다.fastbin range에 속하지 않는 chunk일 경우, chunk 하나만 ``c free()``해도 ``bash (unsorted bin-8)``을 가리키는 `` fd/bk``가 생성된다.* fastbin은 `` main_arena``를 가리키지 않으며 두 개를 ``c free()``해야 첫 번째 free'd chunk에 `` fd``가 생성된다. Note) `` fd/bk``가 가리키는 곳이 그대로 다음 `` fd/bk``가 아니라, `` mchunkptr``이다. 그래서 `` +8`` 해주어야 다음 `` fd/bk``가 나온다. `` fd/bk..
[glibc] malloc - 1
[glibc] malloc - 1
2017.07.19Heap요청에 따라 할당되는, chunk의 형태로 나뉠 수 있는 (인접한)연속된 메모리 영역을 의미한다. 예전에는 한 어플리케이션에 하나의 힙만 존재했지만, 지금은 한 어플리케이션이 여러 힙을 가질 수 있다.각각의 heap은 하나의 arena에만 속할 수 있다. Chunk실제로 ``c malloc()``으로 할당/반환받게 되는 영역을 말한다. 8 bytes의 배수로 할당된다.* 64bit OS에서는 16 bytes의 배수로 할당된다.Glibc's malloc은 chunk-oriented다. 커다란 heap을 다양한 사이즈의 chunk로 나눠 할당한다.하나의 chunk는 하나의 heap 내부에 존재하며, 당연히 하나의 arena에 속한다.각 chunk는 size가 얼마인지, adjacent chunk의 위..