-
ptr[-1], ptr[-2]가 가지는 의미보안개론 2024. 5. 19. 01:56
#include <stdio.h> int main() { int num1 = 10; int arr[5] = {50, 51, 52, 53, 53}; int num2 = 90; int *ptr = arr; printf("addr of num1 = %p\n", &num1); printf("addr of arr[0] = %p\n", &arr[0]); printf("addr of arr[1] = %p\n", &arr[1]); printf("addr of num2 = %p\n", &num2); printf("addr of ptr = %p\n\n", &ptr); printf("arr = %p, %x\n", arr, (unsigned int)arr); printf("ptr = %p, %x\n", ptr, (unsigned int)arr); printf("*arr = %d, *ptr = %d\n", *arr, *ptr); printf("ptr[0] = %d, ptr[1] = %d\n", ptr[0], ptr[1]); printf("ptr[2] = %d, ptr[3] = %d\n", ptr[2], ptr[3]); printf("ptr[-1] = %d, ptr[-2] = %d\n", ptr[-1], ptr[-2]); return 0; }
- 스택 보호 기법 있는 경우
ptr[-2] : 90
일반적으로 스택은 위에서 아래로 쌓이는데,
보호 기법 때문에 배열을 제외한 일반적인 변수를 낮은 주소에 먼저하고 배열을 나중에 할당
왼쪽이 낮은 주소라 하면
num1 - num2 - ptr - arr[0] - arr[1] .. 순서로 할당될 것, 이라고는 할 수 있는데 환경따라 다름
ptr이 가리키는게 arr이니, ptr[-2]는 90이 된다.
Mac OS에선 그냥 배열만 나중으로 빼고 위에서부터 넣는 것처럼 보이긴 하는데,
num1 에서 int가 4바이트인데도 arr과의 차이가 8바이트이다.
ptr - num2 - num1 - arr[0] - arr[1] 순서인데,
num1과 arr의 차이가 8바이트라 ptr[-2]가 num1을 가리키게 되어 10을 보인다.
- 스택의 보호 기법 해제 시
ptr[-1]이 90을 가지게 됨
ptr - num2 - arr[0] - arr[1] - num1 순서
보호를 해제하니 예상대로 ptr[-1]이 90이 나온다.
arr[0] 바로 밑에 저장된 값이 num2이기 때문이다.
보호기법이 리눅스랑 맥이랑 좀 다른 것 같다.
'보안개론' 카테고리의 다른 글
Use After Free (0) 2024.06.03 bin, chunk, double free (0) 2024.06.03 프로그램 버그 예시 (0) 2024.05.19 CIA / Authenticaion, Authorization, Non-repudiation (0) 2024.04.10 암호화: 양방향 - 대칭키, 공개키 / 단방향 - 암호학적 해시 함수 (0) 2024.04.07