ASLR 이 적용되어 있으면 바이너리가 실행될 떄마다 스택, 힙, 공유 라이브러리 등이 무작위 주소에 매핑된다. 하지만 이는 main함수의 주소에는 영향을 끼치지 못한다. 하지만 PIE 기술롣 이를 바꿀수 있다. 이때 리눅스 에서 ELF는 실행파일과 공유 오브젝트로 나뉜다. (공유 프젝-> libc6.so) 공유 오브젝트는 Position-Independent Code(PIC )로 어느 주소에 적재되어도 코드의 의미가 훼손 되지 않아, 재배치가 가능하다. 이는 ASLR과 비슷하여 하위 12bit(3byte)가 항상 같기 때문에 이를 이용하여 함수의 offset을 통해 base(이를 코드 베이스, PIE베이스라고함) 를 구하여 이를 토대로 익스 할수 있다. 하지만 코드베이스를 구하기 어렵다면, 함수 호출관..
*PIE = 위치 독립 코드(실행할 때 마다 매핑되는 주소가 어디든지에 상관없이 실행되는 파일) -> 바이너리의 주소를 랜덤화하여 바이너리의 특정 주소의 값을 수정하는 것과 같은 공격을 방어한다. PLT에는 함수 주소가 Resolve 되지 않았을 때, 함수의 주소를 구하고 실행하는 코드가 있다. (Resolve되었을때 GOT 저장) ASLR이 걸려 있어도 PIE가 적용되어 있지 않다면 PLT의 주소는 고정되므로, 무작위 주소에 매핑되는 라이브러리의 베이스 주소를 몰라도 이방법으로 함수를 실행할 수 있다. --> Return to PLT exploit의 방법 1. 라이브러리의 베이스 주소를 구하여 ASLR을 우회기법. 2. PLT를 이용하여 NX 우회. -PLT를 이용하여 NX 우회- **ROPgadget..
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을 사용하여 찾을 수 있다.