완료됨
System Hacking - mitigation:Stack Canary 카나리 릭 질문 있습니다.
안녕하세요?
카나리 릭을 공부하다가 궁금한 것이 생겨서 질문을 올려봅니다.
#include <stdio.h>
#include <unistd.h>
int main() {
char memo[8];
char name[8];
printf("name : ");
read(0, name, 64);
printf("hello %s\n", name);
printf("memo : ");
read(0, memo, 64);
printf("memo %s\n", memo);
return 0;
}
- 카나리 유출할 때, name 입력으로 aaaaaaaaa를 입력으로 줘서 카나리 첫번째 null까지 덮으므로서 카나리 값이 나오게 했었는데요. 여기서 궁금한점은 TLS에 있는 카나리는 전역변수로 매 함수마다 사용하고 검사한다고 했었는데, 카나리 값의 첫번째 null이 a로 바뀌었는데 강제종료 당하지 않는 이유가 궁금합니다. printf함수가 두 번이나 나오는데 궁금하네용
- 변수 선언 순서가 memo, name인데 예제 칸에서는 memo, name, canary, sfp, return address 였습니다.
그런데, 이전 예제들에서는 name, memo, sfp, return address 순 이었는데 왜 달라지는 건지 궁금합니다.
감사합니다.
#시스템해킹
작성자 정보
답변
2
wyv3rn
무플 방지 위원회장
- 카나리는 함수가 종료되기 직전에 오버플로우를 확인하기 위한 것이기에 종료되기 전이라면 상관 없습니다.
- 실제 할당 순서는 변수의 자료형이나 크기, 컴파일러에 따라 항상 바뀔 수 있습니다. 이에 직접 확인하셔야합니다.
wyv3rn
무플 방지 위원회장
각 함수로 진입해서 보시면 아시겠지만, printf나 read 들도 결국은 메인 함수와 같이 함수 입니다만, 사용자의 입력을 변수에 저장하는지의 여부에 따라 카나리 사용 여부가 결정됩니다.
예를 들어 hello만 출력되는 프로그램인 경우 카나리가 필요없는 것과 같습니다.