일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- information hiding
- Trap
- unity
- 컴퓨터 네트워크
- SJF
- OSI 7계층
- DP
- stride
- 메카님
- link layer
- Security
- 유스케이스
- 배경 그림
- polymorphism
- OWASP
- FIFO
- MAC
- 게임 개발
- 게임개발
- 운영체제
- protection
- 유니티
- MLFQ
- STCF
- Waterfall
- frequency-domain spectrum analysis
- AINCAA
- DSP
- Unity #Indie Game
- SDLC
Archives
- Today
- Total
다양한 기록
ptr[-1], ptr[-2]가 가지는 의미 본문
#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 |