일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- 프로젝트
- ip forwarding
- 화이트해커
- 액티브스캐닝
- OIDC
- 계정 탈취
- SecurityMetric
- 대학원
- AttackGraph
- NMAP
- decap
- recon-ng
- 보안
- Mac
- Social Network in Game
- airdecap-ng
- 공격그래프
- dnsenum
- Container
- cgroups
- Mimikatz
- davtest
- Kublet
- OpenID Connect
- Shift + ESC
- 넷크래프트
- 패시브스캐닝
- Chrome 작업관리자
- 무선채널
- 강의
- Today
- Total
네른
Stack Canary 본문
스택 카나리 보호기법
- 함수의 프롤로그에서 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 |