● Pointer란?
○ Pointer의 특징
● 포인터의 연산
● Pointer의 활용
● 포인터 처리 방식
-----------------------------------------------------------------------
▶ Pointer란?
· C언어만의 독창적인 기능
· 변수를 직접 사용하기 때문에 해킹할때 많이 쓰임
▷ Pointer의 특징
· Pointer는 기존의 Call By Value 방식이 아닌
Call By Reference방식을 사용함으로써 변수의 주소값을 직접 가져와 그 변수값을 사용한다.
Call By Value, Call By Reference 예제)
#include <stdio.h>
#include <stdlib.h>
void CallByValue(int x, int y);
void CallByReference(int *x, int *y);
int main(){
int x, y;
x = 1; y = 2;
printf("============================\n");
printf("\tCallByValue\n");
printf("Before\n");
printf("x: %d, y: %d\n", x, y);
CallByValue(x, y);
printf("After\n");
printf("x: %d, y: %d\n", x, y);
printf("============================\n\n\n");
//----------------------------------------------------
printf("============================\n");
printf("\tCallByReference\n");
printf("Before\n");
printf("x: %d, y: %d\n", x, y);
CallByReference(&x, &y);
printf("After\n");
printf("x: %d, y: %d\n", x, y);
printf("============================\n");
return 0 ;
}
void CallByValue(int x, int y)
{
int tmp;
tmp = x;
x = y;
y = tmp;
}
void CallByReference(int *x, int *y)
{
int tmp;
tmp = *x;
*x = *y;
*y = tmp;
}
#include <stdio.h>
#include <stdlib.h>
void CallByValue(int x, int y);
void CallByReference(int *x, int *y);
int main(){
int x, y;
x = 1; y = 2;
printf("============================\n");
printf("\tCallByValue\n");
printf("Before\n");
printf("x: %d, y: %d\n", x, y);
CallByValue(x, y);
printf("After\n");
printf("x: %d, y: %d\n", x, y);
printf("============================\n\n\n");
//----------------------------------------------------
printf("============================\n");
printf("\tCallByReference\n");
printf("Before\n");
printf("x: %d, y: %d\n", x, y);
CallByReference(&x, &y);
printf("After\n");
printf("x: %d, y: %d\n", x, y);
printf("============================\n");
return 0 ;
}
void CallByValue(int x, int y)
{
int tmp;
tmp = x;
x = y;
y = tmp;
}
void CallByReference(int *x, int *y)
{
int tmp;
tmp = *x;
*x = *y;
*y = tmp;
}
▶포인터의 연산
· 포인터의 연산은 일반 연산처럼 +, -기호를 사용한다.
· 그러나 포인터는 연산을 할 때 일반 연산과 차이점을 보인다.
· 쉬운 예를 위해 두개의 포인터 int x(00000000), int y(00000005)의 연산을 알아보겠다. (주소값)
· +인 경우 (x = y + 1)
x의 출력값은 00000006가 아닌 00000009가 된다.
이유는 일반 연산처럼 그냥 +1을 더해주는 것이 아닌 '포인터 자료형의 크기만큼 1번 더해준다'라는 뜻이기 때문이다.
그래서 결론적으론 +4가 되니, 00000005 + 00000004를 해준 00000009가 x에 대입되는 것이다.
· -인 경우 (x = y - 1)
x의 출력값은 00000004가 아닌 00000001이 된다.
이유는 일반 연산처럼 그냥 -1을 빼주는 것이 아닌 '포인터 자료형의 크기만큼 1번 빼준다'라는 뜻이기
때문이다.
그래서 결론적으론 -4가 되니, 00000005 - 00000004를 해준 00000001이 x에 대입되는 것이다.
· 추가적으로
· +는 순방향으로 이동하고
-는 역방향으로 이동한다.
· 곱하기와 나누기는 컴파일 에러가 일어난다.
· +2일 경우에는 +1과 다르게
+ (포인터 자료형의 크기 * 숫자) 이니
+ (4 * 2) => +8이 된다. (빼기도 마찬가지)
▶ Pointer의 활용
· 변수의 값을 '직접' 사용하기 때문에
1) 구조체에서 메모리 관리가 수월해 진다.
2) 배열을 동적할당 할 수 있다.
3) 함수를 사용할때 작업하기 정말 편해진다. 등등
▶ 포인터 처리 방식
· 포인터의 문자열 처리방식
1) 문자열의 주소만 가리키고 있기 때문에 해당 문자열 수정 불가능
2) 중간의 해당 문자열 주소가 아닌 다른 문자열 주소를 가질 수 있음 (배열은 불가능)
3) 문자열을 입력받기 위해서는 메모리 공간이 할당 되어야 한다.
'Layer7 > 동아리 숙제' 카테고리의 다른 글
Dreamhack 공부 내용 정리 및 문제풀이 (Reversing) (0) | 2020.08.07 |
---|---|
gdb를 활용한 간단한 바이너리 분석과 보고서 작성 (0) | 2020.07.12 |
python과 pwntools 활용법 익히기 (0) | 2020.07.08 |
모두의 코드 C pointer 문제풀이 (0) | 2020.07.03 |
Linux 환경 구축 (0) | 2020.06.28 |