본문 바로가기
Today I learned

2020 10 14

by soheemon 2020. 10. 14.

Canary

요약하자면, return value전에 특정 값을 넣어서, return address로 돌아가기 전에 canary값이 실행전과 일치하는지 여부를 확인하는 메커니즘이다.

만약 컴파일러가 canary영역의 4byte를 전부 'a'로 채우면 무슨 문제가 발생할까?

buffer overflow공격에 해당 값을 사용할 수 있다. -> canary값이 변경되지 않았는지 판단하기가 어려워진다.
따라서 canary는 추측하기 어렵거나, 추측하기 쉬우더라도 여전히 버퍼 overflow공격 여부를 판단할 수 있어야한다.

Canary 값을 어떻게 지정할것인가?

1.종결문자를 canary값으로 사용하기

여러 C 함수들은 특정 문자들을 종결문자로 사용한다.(해당 문자를 받으면 사용자입력이 완료되었다고 판단한다.)
예) gets() sprintf().
결과적으로, canary의 4byte영역이 이러한 종결문자중 하나와 일치한다면, 종료되어 overflow를 방지한다.

2.초기화마다 난수를 생성하여 사용하기(*현재 흔하게 사용됨!)

stack canary가 감지 할 수 없는 취약점

  • canary값 이전의 함수포인터를 overwrite하여 공격하는경우. stack canary는 return address 변조여부만 감지하기 때문에 함수포인터 변조는 탐지할 수 없다.
  • 공격자는 데이터포인터를 덮어쓴 다음 이를 활용하여 임의의 메모리 쓰기를 수행할 수 있다.
    int \*ptr = ...;  
    char buf\[128\];  
    gets(buf); // 128byte를 초과하는 데이터를 받았다고 가정한다.
    ptr = 5; // 공격자가 의도한 주소로 덮어쓰게 된다.. 카나리로 감지 불가한 케이스.  
  • Heap object overflow (function pointers)
  • malloc/free overflows
int main(int argc, char **argv) {
    char *p, *q;
    p = malloc(1024);
    q = malloc(1024);
    if(argc >= 2)
        strcpy(p, argv[1]);
    free(q);
    free(p);
    return 0;
}
  • p와 q에 속하는 두개의 메모리 블록이 메모리에 인접/접속되어 있다고 가정하자.

'Today I learned' 카테고리의 다른 글

2020 10 21  (0) 2020.10.21
2020 10 16  (0) 2020.10.16
2020 10 13  (0) 2020.10.13
2020 10 07  (0) 2020.10.07
2020 10 05  (0) 2020.10.05

댓글