0x00000000000006b2 : mov rax,QWORD PTR fs:0x28 0x00000000000006bb : mov QWORD PTR [rbp-0x8],rax 0x00000000000006bf : xor eax,eax 위 코드와 같이 rbp 직전에 8바이트 만큼의 공간에다 fs:0x28, 즉 카나리 값을 넣는걸을 볼 수 있다. 0x00000000000006dc : mov rcx,QWORD PTR [rbp-0x8] 0x00000000000006e0 : xor rcx,QWORD PTR fs:0x28 0x00000000000006e9 : je 0x6f0 0x00000000000006eb : call 0x570 마지막에 이를 fs:0x28값과 xor 시켜 0, 즉 참(어셈 조건문은 0일때 참이다) ..
Tcache Poisoning이란 DFB를 활용해 해당 청크를 해제된 청크임과 할당된 청크, 즉 중첩 상태를 만들어 이를 활용해, 임의 주소에 청크를 할당하여, 그청크를 이용하여 임의 주소에 데이터를 읽거나 조작하는 공격 기술을 말한다. 첫째줄 A1이 해제되어 청크가 tcache_entry에 할당되고, 그다음에 B1이 DFB로 할당되었다고 하자. 그후 LIFO 구조 이기 떄문에 B1을 할당하여 A1를 중첩 상태로 만들고 B1의 내용의 첫 8바이트, 즉 fd(next)값, 나 이후로 해제된 값, stdout으로 지정해준다. 그럼 A1이 할당되면서 stdout_plt를 다음 할당 청크로 주소로 생각한다. 그후 할당을 한번 더 하게 되면 stdout_plt가 청크가 되며, 청크를 수정할 경우 "got를 수정"..
tcache 2.29 이상의 버전에서 key값 검사.. 이전 버전(ex..glibc 2.27)에선 별도 검사 없음. 또한 tcache 2.29(2.30)에서 DFB를 사용할때 tc_ idx값, 즉 청크 할당 및 해제를 3개 정도 하여 낮지 않은 값을 가지도록 한다. == 이는 이후 tcache_entry를 참조하여 할당할때 필요함. (**https://velog.io/@woounnan/PWNABLE-tcache-bin-attack-in-glibc-2.30) 목표: duplicated free list를 이용하면 임의 주소에 청크를 할당할 수 있음을 이해하자. duplicated free list는 임의의 청크를 두번이상 free하여 *free list(bin)에 여러번 청크를 추가하여 만들수 있다. Th..
bin: free된 청크들이 저장되는 객체 의의: 메모리 낭비를 막음, 해제된 청크를 빠르게 탐색하여 재사용할 수 있게 함. ptmalloc has 128 bin. ALL 128 -- Small bin: 62 Large bin: 63 Unsortedbin: 1 not-used: 2 실제 구조 0. not-used 1. unsorted bin 2. small[0] ... 63. smal[61] 64. large[0] .. 126. large[62] 127. not-used -------------------- small bin: 32byte ~ 1023 byte small bin[0] : 32byte .. small bin[61] : 1008byte small bin structure: circular d..
현 gblic 2.23 추후 2.27.ver above __tcache 내용도 추가 하겠습니다. Dangling Pointer : 유효하지 않은 메모리 영역을 가리키는 포인터. free 함수: 청크를 ptmalloc 에 반환 시킴 --> pointer is still alive : Dangling Pointer Use After Free: 개념은 말 그자체로 해제된 메모리에 다시 접근하게 될 때 나타나는 취약점을 뜻함. UAF는 다른 기법을 사용할 수 있게 하는 하나의 수단. 1. Unsorted bin 과 함게 사용하기 unsorted bin에 연결되는 청크의 fd, bk는 libc내부의 주소가 쓰여, 이를 이용해 libc가 매핑된 주소를 leak할 수 있습니다. (*unsorted bin은 small..
"environ ptr"란 스택 최상위를 가르키는 기본적인 환경을 구성하기 위한 포인터이다. 그럼 이를 통해 무엇을 할 수 있을까? 바로 스택에서 내가 조작한 버퍼, 포인터의 주소를 알 수 있다. 그럼, 어떻게 이 포인터를 활용 할 수 있을지 알아보도록 하자. 라이브러리(libc.so.6)에서 프로그램의 환경 변수를 참조해야 할 일이 발생 할 떄를 대비해서, environ 포인터 만들어 놨다. 이는 로더의 초기화 함수에 의해 초기화 된다. 만약 바이너리 내에서 스택영역의 주소를 가지고 있는 포인터의 주소를 알 수 없다면 environ ptr을 사용하여 찾을 수 있다.
House of Force 기법은 top chunk의 size를 조작함으로써 임의의 주소에 힙 청크를 할당 할 수 있는 공격기법이다. 이 기법을 사용하기 위해서는 공격자가 top chunk의 size를 조작하고, 원하는 크기의 힙 청크를 할당 할 수 있어야 합니다. top chunk를 처리하는 _int_malloc코드의 설명입니다. static void * _int_malloc(mstate av, size_t bytes){ INTERNAL_SIZE_T nb; mchunkptr remainder; unsigned long remainder_size; victim = av->top; size = chunksize(victim); if(size >= (nb+MINSIZE)){ remainder_size = s..