* 스레드 스택에서 사용하는 마스터 카나리와 메인 스레드 스택에서 사용하는 마스터 카나리는 서로 위치가 다르다.
하지만 값은 상속 받기 때문에 같다.
카나리 값을 릭 할때 만약 잘 출력이 되지 않은다면, 마스터 카나리와의 offset을 구한후 마스터 가나리를 릭한다.
SSP는 스택 버퍼 오버플로우로 부터 변환 주소를 보호 하는 기법으로, 스택 버퍼가 존재하는 함수 내부에서 임의로 생성된 값을 버퍼 마지막에 삽입하여 검증 과정을 거쳐 보호하는 기법이다.
이떄 카나리 값이 존재하는 위치는 TLS(Thread Local Storage)이다.
먼저 ELF 바이너리 구조를 살펴보면 각각의 목적을 가진 섹션에서 데이터를 관리함을 알수 있다.
1. 코드를 실행하기 위한 .text
2. 초기화 되지 않은 전역 변수를 위한 .data
...
TLS 영역은 스레드의 전역 변수를 저장하기 위한 공간으로, 로더(Loader)에 의해서 할당 됨.
Thread Local Storage
: 밑의 사진은 로더에서 TLS영역을 할당하고 초기화하는 함수, init_tls의 코드이다.
코드를 보면 _dl_allocate_tls_storage 함수에서 TLS영역을 할당하고 이를 tcbp에 저장한 뒤 TLS_INIT_TP 매크로의 인자로 전달 하는 것을 볼 수 있다.
SET_FS
: 밑의 사진은 dl_allocate_tls_storage 에서 할당된 TLS영역을 FS로 초기화 하는 TLS_INIT_TP 매크로 코드이다.
어셈블리 코드를 보면, arch_prctl 시스템 콜의 첫 번째 인자로 ARCH_SET_FS, 두 번째 인자로 TLS 주소(_thrdescr)가 들어 가는 것을 볼 수 있다.
즉 arch_prctl 시스템 콜의 ARCH_SET_FS는 프로세스의 FS 세그먼트 레지스터를 초기화 하는 작업을 하는 명령어로 FS 세그먼트는 TLS영역을 가르킨다.
Master Canary
: 함수 프롤로그에서 FS:0x28에 위치하는 값을 가져와 RBP 바로 앞에 삽입하는데, 이떄 FS 세그먼트 레지스터는 앞서 arch_prtctl 시스템 콜을 통해 _dl_allocate_tls_storage 에서 할당한 주소로, 모든 함수가 해당 주소에서 값을 가져오기 때문에 같은 카나리 값을 사용하는 것이다. 즉 TLS 주소에서 0x28 바이트 만큼 떨어진 주소에 위치한 랜덤한 값을 마스터 카나리 라고 한다.
생성 과정
security_init function
: 앞의 과정을 거쳐 할당된 TLS 영역에 랜덤한 카나리 값을 삽입하는 함수.
_dl_setup_stack_chk_guard(func): 커널에서 생성한 랜덤한 값을 가지는 포인터인 _dl_random을 인자로 카나리를 생성시키는 함수다.
보면 dl_random이 NULL이 아닐 경우, 공용체 변수 ret에 dl_random을 복사한다. 이후 바이너리의 바이트 오더링에 따라 AND연산을 수행하는데, 리틀엔디언의 경우 복사한 값의 첫바이트를 NULL로 변환한다. -> NOT(FF) AND 7777 -> 7700
즉 카나리의 첫 바이트가 NULL인 이유는 위의 과정 때문인것이다.
THREAD_SET_STACK_GUARD(MACRO): 카나리 생성 후 해당 값을 이 매크로의 인자로 전달한다. 이 매크로는 THREAD_SETMEM 매크로를 통해 두 번째 인자인 header.stack_guard 위치에 value(Canary)를 삽입한다.
다음은 THREAD_SET_STACK_GUARD 매크로의 코드다.
이떄 할당된 TLS 영역은 tcbhead_t 구조체로 구성되어 있고, 이중 stack_guard는 스택 카나리의 값을 가지는 멤버 변수이다. 결국 THREAD_SETMEM 을 통해 카나리가 header(tcbhead_t, TLS).stack_guard 위치(TLS+0x28)위치에 삽입된다.
struct tcbhead_t :
'Pwnable > Tech' 카테고리의 다른 글
house of lore 간단 설명 (0) | 2023.01.30 |
---|---|
OOB - Out of Bounds (0) | 2022.02.14 |
SHA - SECCOMP(Sandbox), Bypass SECCOMP (0) | 2022.02.10 |
FSB 에 대해 (0) | 2022.02.07 |
PIE와 RELRO (0) | 2022.01.27 |