본문 바로가기
정보보안/시스템 해킹

Stack Canary

by dustnn 2024. 11. 25.

여태까지는 단순 stack buffer overflow를 다뤘다면

이제는 canary가 추가됐을 때를 볼 거다.

 

 

런타임일 때마다 canary 검사 실행

 

 

TLS란 그냥

 

TLS 주소는 fs register가 가지고 있다.

fs가 가리키고 있는 주소값을 알면, TLS 주소를 알 수 있다.

TLS에서 0x28만큼 떨어진 주소에 canary가 위치한다.

따라서 TLS 주소만 알고 있다면, canary 값을 획득하고 변조할 수도 있다.

 

 

 

RSI: fs가 가리키게 될 값

RDI: ARCH_SET_

 

 

Stack Canary 우회 방법

 

Brute Force

: 무차별 대입

 

TLS 접근

: TLS에 저장된 카나리값 변조

 

Stack Canary Leak

: 카나리를 유출시켜

:

 

Return to Shellcode

 

문제 코드

 

canary 존재한다.

 

컴파일해주고 실행해줬더니

buf의 시작 주소: 0xffffc2600d48

buf~RBP 사이 거리: -24로 나온다... 뭐가 문젤까

 

취약점

 

buf 크기는 0x50인데 name은 0x100만큼 입력받으므로 BOF 발생

=> buf~canary 사이를 임의의 값으로 채워 buf 출력 시 canary값도 출력되도록 할 수 있음

 

leak+exploit 코드

 

 

왜이러냐

 

 

 

1. 반환 주소를 임의로 덮을 수 있음

2. 데이터 입력할 수 있는 버퍼의 주소를 알 수 있었음

3. 해당 주소의 버퍼가 실행 가능함 ...의 조건을 만족했기 때문에 셸 코드 실행이 가능했다

공격자의 침입을 어렵게 하기 위해:

1. 메모리에서 임의의 버퍼 주소를 알기 어렵게 하기

2. 메모리 영역에서 불필요한 실행 권한 제거

ssp_001

stack에 canary가 존재하는 것을 확인할 수 있다.

 

문제 코드

 

취약점

 

run 했을 때

 

1. print_box() 함수

다음과 같이 print_box 선택해

box[] 길이를 검증하지 않고 인덱스를 받아오기 때문에 box[] 아래 메모리값을 읽어올 수 있다.

 

2. name size

main에서 name 길이를 0x40으로 지정한 반면 name size를 다시 입력받기 때문에 BOF 발생

 

=> P에서 cunury를 leak시킨 다음,

E에서 RET, 즉 main함수 반환 주소를 get_shell()함수로 덮어씌우면 될 것이다.

 

 

디버깅

 

스택 구조는 다음과 같다고 추측 가능하다.

 

 

'정보보안 > 시스템 해킹' 카테고리의 다른 글

ASLR&NX  (0) 2024.12.22
시스템 해킹 입문하며  (0) 2024.12.22
Stack Buffer Overflow  (0) 2024.11.25
Dreamhack_Assembly Quiz  (0) 2024.11.25