네른

Stack Canary 본문

강의 정리/드림핵 정리

Stack Canary

네른 2022. 2. 17. 17:05

스택 카나리 보호기법

 - 함수의 프롤로그에서 return address와 버퍼 사이에 임의의 값을 삽입함

 - 함수의 에필로그에서 해당 값이 변조되었는지 확인함

      Why? - Return address를 덮어씌우려면 반드시 그 앞의 버퍼를 채우면서 지나가게 되므로 BOF 공격을 막을 수 있음

 

 - stack canary가 적용된 바이너리에 BOF 공격을 그대로 수행하면 stack smashing detected라는 오류가 발생

$ gcc -o canary canary.c
$ ./canary
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
*** stack smashing detected ***: <unknown> terminated
Aborted

 

  == prologue ==
   0x00000000000006b2 <+8>:     mov    rax,QWORD PTR fs:0x28     
   0x00000000000006bb <+17>:    mov    QWORD PTR [rbp-0x8],rax   
   0x00000000000006bf <+21>:    xor    eax,eax            
   
  == epilogue ==
   0x00000000000006dc <+50>:    mov    rcx,QWORD PTR [rbp-0x8]    
   0x00000000000006e0 <+54>:    xor    rcx,QWORD PTR fs:0x28      
   0x00000000000006e9 <+63>:    je     0x6f0 <main+70>                   
   0x00000000000006eb <+65>:    call   0x570 <__stack_chk_fail@plt>

이와 같은 어셈 코드들이 함수의 프롤로그와 에필로그에 추가됨

여기서 fs는 세그먼트 레지스터의 일종으로, 프로세스 시작시에 해당 위치에 랜덤한 값이 저장됨!

 - fs는 기존에 알고있던 코드세그먼트(Code segment), 데이타 세그먼트(Data Segment)처럼 목적이 정해진 세그먼트가 아님. 임의로 사용할 수 있는 세그먼트!

 - 실제로 리눅스는 이 fs를 TLS(Thread Local Storage)를 가리키는 포인터로도 사용함

 

TLS 주소 확인하기

 - fs == TLS 이므로, fs의 값을 알면 TLS 주소를 알 수 있음

 - 하지만 이 fs는 특정 시스템콜을 사용해야지만 조회할 수 있기 때문에, arch_prctl(ARCH_SET_FS, addr) 함수가 실행되는 시점을 확인하여 이 fs 값을 알아볼 수 있음

 - 위 함수가 호출될 때의 rdi는 0x1002(ARCH_SET_FS)이고 rsi는 fs의 주소!

 - 그러나 이 때, fs주소+0x28 (스택 카나리 랜덤 값)에는 아무런 값이 없음.

 

++ 이러한 정보는 어떻게 아는가? gdb에서 catch syscaLL ARCH_PRCTL 과 같은 명령어를 실행하면 됨.

        - CATCH는 특정 이벤트가 발생 시 프로세스를 중지 시키므로!

 

 - fs의 주소를 안 이후에, watch *(fs주소+0x28) 명령어를 사용하여, 스택 카나리 값이 변화하는 시점을 확인

 - 확인해보면 security_init 이라는 함수에서 프로세스가 중단되고, fs주소+0x28 위치에 특정 값이 셋팅되어있음을 확인할 수 있음

 

++ 스택 카나리 값에는 무조건 1byte만큼의 널값이 맨 앞에 들어가있음

'강의 정리 > 드림핵 정리' 카테고리의 다른 글

[dreamhack] 라이브러리 (Static Link, Dynamic Link)  (0) 2022.03.02
NX & ASLR  (0) 2022.03.02
Stack Buffer Overflow  (0) 2022.02.15
Calling Convention  (0) 2022.02.15
pwntools API 정리  (0) 2022.02.11
Comments