| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- Dreamhack
- NX
- pwnable
- Git
- pwntools
- strcpy
- shellcode
- zbhack
- c언어
- c 언어
- linux
- Bandit
- plt
- C
- ASLR
- Crypto
- 혼공 c
- 2차원 배열
- CTF
- pwnable.kr
- Little Endian
- zb
- 포인터
- 배열
- ssh
- sfp
- 혼공C
- stack buffer overflow
- buffer
- Stack Canary
- Today
- Total
zerobean's archive
[pwnable] Stack Canary 본문
dreamhack 시스템 해킹 로드맵 중 stack canary를 정리한 글입니다.
틀린 부분 있다면 댓글로 알려주시기 바랍니다.
1. 서론
stack buffer overflow 공격 기법에서 버퍼에 오버플로우를 발생시켜 ret을 덮어 원하는 명령어를 실행시키는 방법을 사용했다. 그래서 이를 방어하기 위한 방법으로 stack canary가 나오게 되었다.
2. 카나리
stack canary는 buffer와 ret사이에 임의의 값을 집어넣어 함수의 변조를 방어하는 기술이다. 만약 카나리 값이 틀리다면 stack buffer overflow를 탐지하고 프로세스를 강제 종료 시킨다.
카나리 값은 프로세스가 시작할 때 TLS에 전역변수로 저장된다. 여기서 fs가 TLS를 가리킨다. 구체적인 실습은 넣지 않겠다.
프로세스가 시작하면 저장되기 때문에 gdb를 통해 카나리 값이 무엇인지 찾아낼 수 있다.
카나리 값은 x64 아키텍처에서 8바이트 할당해 주지만 실제 값은 7바이트만 사용한다. 카나리의 첫 번째 값은 NULL이기 때문이다.
3. 카나리 우회
카나리가 나오자 이를 우회하는 방법도 생기게 되었다.
1. 무차별 대입 방법
이는 가능한 모든 값을 대입하는 방법으로 x64 아키텍처에선 카나리가 8바이트, x86 아키텍처에선 카나리가 4바이트이기 때문에 모두 대입해 보는 것은 현실적으로 어렵다.
2. TLS 접근 방법
앞에 언급한 TLS에 있는 카나리 값을 직접 찾아내는 방법이다. 카나리 값은 프로세스 실행때마다 변경된다. 하지만 실행 중에는 찾아낼 수 있다. 찾아낸 카나리를 페이로드에 포함시키면 카나리 우회가 가능하다.
3. 카나리 릭
오버플로우 취약점을 이용하는 경우 카나리 릭을 통해 카나리 값을 알아 낼 수 있다. 하지만 이 방법은 이게 가능한 코드에서만 사용할 수 있다는 한계가 있다. 이게 가능한 코드는 오버플로우 취약점이 있는 입력을 두 번 받는 코드이다.
'pwnable > 개념' 카테고리의 다른 글
| [pwnable] PLT & GOT (0) | 2024.01.12 |
|---|---|
| [pwnable] NX & ASLR (0) | 2024.01.12 |
| [pwnable] stack buffer overflow (0) | 2023.09.24 |
| [pwnable] calling convention (0) | 2023.09.23 |
| [pwnable] pwntools (0) | 2023.07.14 |