Stack Canary 우회

2018. 5. 3. 23:33

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 : 다른분, 출제자


+ Recent posts