Stack Canary - Mitigation of Overflow

Lia·2021년 12월 7일
0

System_Hacking

목록 보기
3/5

Canary는 오버플로우 취약점으로부터 메모리를 보호하기 위해
사용되는 방법 중 하나 입니다.

그 중 Stack Canary 는 SFP 아래(낮은 주소)에
삽입하고, 해당 값의 변조를 확인하여 보호하는 방법입니다.


Stack Canary가 스택을 보호하는 방법

스택 카나리의 동작을 확인하기 위해서 스택 카나리가 적용된 ELF 파일을
생성하도록 하겠습니다.


다음 두 사진은 각각 스택 카나리가 적용되지 않은 사진과 적용된 사진 입니다.

스택 카나리가 적용되지 않은 main함수

스택 카나리가 적용된 main함수

스택 카나리가 적용된 main함수를 보면 main+8에서 fs:0x28의 값을
rax에 저장하는걸 확인할 수 있습니다.

fs:0x28은 세그먼트 레지스터의 일종으로 리눅스는 프로세스를 실행할 때에
fs:0x28에 랜덤한 값을 생성합니다.

그런 다음 rax에 저장된 랜덤한 값을 rbp(base pointer) - 0x8에 저장합니다.

이후 함수의 에필로그에서 스택 카나리의 값이 변조되었는지 확인합니다.

rbp - 0x8에 저장되어 있던 Stack Canary 값을 rdx에 저장합니다
이후 xor 연산으로 fs:0x28과 rdx, 즉 Canary의 값이 변조되었는지 확인합니다.

변조가 되지 않았다면 그대로 main함수는 정상적으로 종료되고
만약 변조가 되었다면 __stack_chk_fail 함수가 호출됩니다.


Stack Canary 우회

1. 무차별 대입 (Brute Force)

x86 아키텍쳐의 스택 카나리의 크기는 4byte
x64 아키텍쳐 스택 카나리의 크기는 8byte 입니다.

이때 스택 카나리는 Null byte를 포함하고 있으므로 실제로는 각각
3byte와 7byte의 랜덤한 값이 스택 카나리의 저장됩니다.

스택 카나리의 값을 무차별 대입으로 x86의 경우 구할수는 있겠지만
실제 서버를 대상으로 무차별 대입을 하는 것이 어렵고

x64의 경우 256^7번의 연산을 해야 함으로 실제적으로 무차별 대입으로
스택 카나리의 값을 알아내는 것은 불가능 합니다.

2. Stack Canary Leak

만약 프로그램에 스택 카나리의 값을 확인할 수 있는 취약점이 존재한다면
공격자는 이를 이용하여 스택 카나리 검사를 우회할 수 있습니다.

다음은 스택 카나리의 값을 확인할 수 있는 취약점이 존재하는 코드 입니다.

첫 번째 입력에서 길이 0x58만큼 입력하면
17번째 라인에서 스택 카나리의 값을 확인할 수 있습니다.

printf() 는 문자열의 Null Byte를 만날 때 까지 스택에 있는 값을 출력하게 됩니다. 이때 스택 카나리는 Null Byte를 포함하고 있으므로 버퍼의 크기보다 1 더 크게 입력하게 되면 스택 카나리의 Null Byte가 덮어 씌워지게 됩니다. 따라서 스택 카나리의 값을 확인 할 수 있게 됩니다.

실습의 편의를 위해서 다음과 같이 PIE는 적용시키지 않았습니다.

먼저 hello_admin의 주소를 확인하도록 하겠습니다.

hello_admin을 실행하기 위한 코드는 다음과 같습니다.

실행 결과는 다음과 같습니다.

profile
하고싶은게 많아요

0개의 댓글