Stack Canary 우회
canary 란?
메모리 보호 기법 중 하나.
랜덤 값인 canary 를 ebp 와 지역 변수 사이에 위치시킵니다.
함수가 시작할 때 canary 값을 저장하고, 함수가 끝나기 전에 canary 값이 변조됐는지 여부를 체크합니다.
윈도우에서는 스택 쿠키(stack cookie)라고도 하는듯.
bof를 해서 return address 를 덮어 실행흐름을 바꾸려할 때, canary 값까지 덮어버리면 함수가 끝나기 전에 canary 값이 변조된 것을 보고 프로그램을 종료시키게 된다. 이 때 canary 값이 변조되었을 경우 *** stack smashing detected *** 라고 뜨면서 종료된다.
아이다(Ida)로 봣을 때는 코드상 저부분이고
gdb로 보면 밑줄 친 저부분이다.
그리고 저것이 SSP (Stack Smashing Protector)라는 것이다.
SSP로 컴파일되면 아래와 같은 구조가 된다.
그리고 지역변수가 있다면 스택의 순서도 바꿔준다.
1 2 3 4 5 6 7 | int main() { int check1; int check2; char buf[50]; return 0; } | cs |
위와 같은 코드가 있으면 이론적으로 스택구조는 아래 순서가 된다.
buf - check2 - check1 - sfp - ret - arg ...
그러나 SSP는 이런 지역변수의 순서를 바꾸어주어 아래와 같이 된다.
check2 - check1 - buf - check - canary - xxx - sfp - ret - arg ...
물론 카나리도 추가된다.
우회법
1. Brute Force
canary값은 4byte이므로 1byte씩 브루트포싱을 하면서 canary값을 알아낼 수 있다. buffer을 모두 채운다음 다음 4바이트가 Canary일 때 1바이트씩 canary값을 덮으면서 만약 *** stack smashing detected ***으로 종료되면 이것은 틀린것이고, 아니라면 맞는것이므로 이렇게 알아낼수 있다.
범위는 0x00~0xFF로 256가지이고 이걸 4번만 하면 된다.
1-1. fork를 사용할 때에 유효
fork는 프로세스를 복제하는데 이 뜻은 부모와 자식이 동일한 카나리를 공유한다는 뜻이다. 몇번의 시도로 카나리를 추측할 수 있다면 카나리를 찾을 수 있다는 뜻이다. 공격 방식에 따라 카나리 하위 한바이트 한바이트씩 추측해서 카나리를 예측 할 수 있음.
2. recv, strncpy
rev와 strncpy 함수는 문자열을 입력받을시 NULL이 들어가지 않는다. 이를 이용해 buffer가 printf()된다면 buffer를 꽉채워 null을 없애 canary까지 출력하게 할 수 있다.
3. Canary 루틴 노출
Canary를 만드는 루틴이 노출될 경우 역연산을 통해서 canary를 알아낼 수 있다.
4. scanf("%d", var[i]); 에서 i가 범위를 넘어서 카나리값을 넘어 입력할 수 있을때
원래는 숫자만 입력가능하다. 문자가 입력될 경우, 문자가 버퍼에 남게되어 모든 scanf("%d")가 통과되어버리는데,
문자열 +, -는 예외로 입력가능하다. 게다가 버퍼에 남지도 않을뿐더러 해당 변수에 아무런 값도 저장하지않고 다음으로 넘어갈 수 있기때문에
카나리를 손상시키지않고 return addresss만 변조시킬수 있다.
5. pthread를 사용.
pthread에서 canary 유출가능
https://xerxes-break.tistory.com/405?category=679890
참고한 곳:
[poxx2016] canaria(150pt) 문제풀이 : https://bpsecblog.wordpress.com/2016/12/09/poxx2016-canaria/
리눅스 메모리 보호기법 우회 연구분석보고서 : http://teamcrak.tistory.com/330
SSP - Stack Canary에 대한 Phrack 자료 번역 : http://hackability.kr/entry/SSP-Stack-Canary%EC%97%90-%EB%8C%80%ED%95%9C-Phrack-%EC%9E%90%EB%A3%8C-%EB%B2%88%EC%97%AD
[Codegate 2016] watermelon write up : 다른분, 출제자
'Pwnable!!' 카테고리의 다른 글
pwntools를 이용한 socket (0) | 2018.05.15 |
---|---|
메모리 보호기법 공부 및 우회법 (사이트) (0) | 2018.05.03 |
netstat으로 열려있는 포트찾기 (0) | 2018.05.03 |
포너블을 위한 툴들 (0) | 2018.04.30 |
Linux/x64 Shellcode 모음 (64bit / 64비트) (0) | 2018.04.30 |