전체 글

스택 버퍼 오버플로우1. 스택 버퍼 오버플로우1. 버퍼 (Buffer)버퍼는 데이터가 목적지로 이동되기 전에 보관되는 임시 저장소의 의미로 쓰인다. 버퍼는 데이터의 처리 속도가 다른 두 장치가 있을 때, 이 둘 사이에 오가는 데이터를 임시로 저장해 완충 작용을 한다.즉 수신측과 송신 측 사이에 버퍼라는 임시 저장소를 두고, 이를 통해 간접적으로 데이터를 전달하게 한다.이렇게 하면 버퍼가 가득 찰 때까지는 유실되는 데이터 없이 통신할 수 있다.빠른 속도로 이동하던 데이터가 안정적으로 목적지에 도달할 수 있도록 완충 작용을 하는 것이 버퍼의 역할이다. 현대에는 이런 완충의 의미가 많이 희석되어 데이터가 저장될 수 있는 모든 단위를 버퍼라고 부르기도 한다. 스택에 있는 지역변수는 스택 버퍼, 힙에 할당된 메모..
함수 호출 규약 1. 함수 호출 규약 1. 함수 호출 규약이란? 함수 호출 규약은 함수의 호출 및 반환에 대한 약속이다. 함수를 호출할 때 파라미터를 어떤 식으로 전달하는지에 대한 규칙을 정의한다. caller (호출자) : 함수를 호출한 곳 callee (피호출자) : 호출 당하는 함수 함수 호출 규약을 적용하는 것은 일반적으로 컴파일러의 몫이다. 프로그래머가 코드에 명시하지 않는다면, 컴파일러는 CPU 의 아키텍처에 적합한 함수 호출 규약을 적용한다. 2. 함수 호출 규약 종류 컴파일러는 지원하는 호출 규약 중, CPU 아키텍처에 적합한 것을 선택한다. x86 (32bit) 아키텍처는 레지스터의 수가 적으므로, 스택으로 인자를 전달하는 규약을 사용한다. 반대로 x86-64 (64bit) 아키텍처는 레..
스택 프레임 1. 스택 프레임 1. 스택프레임이란? 스택은 함수가 사용하는 지역변수, 파라미터 등이 저장되는 공간이다. 하지만 이런 스택 영역을 아무런 구분 없이 사용하게 된다면, 서로 다른 함수가 같은 메모리 영역을 사용할 수 있게 된다. 따라서 함수별로 사용하는 스택의 영역을 명확히 구분하기 위해 스택 프레임(Stack Frame)이 사용된다. 대부분의 프로세스에서는 함수가 자신이 호출될 때 스택 프레임을 만들고, 반환할 때 이를 정리한다. 2. 함수 호출 단계 함수 호출 함수가 사용할 매개변수를 스택에 넣고 함수 시작 지점으로 점프한다. 함수 프롤로그 함수 내에서 사용할 스택 프레임을 설정한다. 함수의 본체 함수의 내용을 수행한다. 함수 에필로그 함수가 끝나면 처음 호출한 지점으로 돌아가기 위해 스..
어셈블리어 정리 1. 어셈블리어 1. 어셈블리어란? 어셈블리어는 기계어와 1대1로 대응되는 명령어 체계를 가진 컴퓨터 프로그래밍 언어이다. intel 문법과 AT&T 문법이 존재하고, 서로 호환이 되지 않는다 Opcode : 명령어 Operand : 피연산자 Intel Operand 의 경우 Operand2 가 Source 가 되고 Operand1 이 Destination 이 된다. 위의 경우에는 EBX 의 값을 EAX 에 더한다 라는 뜻이 된다. AT&T의 경우는 반대가 되어 EAX 의 값을 EBX 로 더한다 라는 뜻이 된다. Intel 문법은 숫자 그대로 사용한다. 1, 2, 3, 4, 5 AT&T 문법은 숫자 앞에 $ 를 붙인다. $1, $2, $3, $4, $5 앞으로 나올 어셈블리는 Intel ..
x86-64 아키텍처: 레지스터 (Register) 1. 레지스터 1. 레지스터란? 레지스터는 CPU 가 요청을 처리하는데 필요한 데이터를 일시적으로 저장하는 기억장치이다. CPU 가 재빨리 읽고 쓰기를 해야하는 데이터들이므로 CPU 내부에 존재하는 메모리를 사용한다. 연산 제어, 디버깅 등의 목적으로 사용한다. 연산을 위한 데이터를 레지스터에 저장하고, 그 결과값도 레지스터에 저장한다. 레지스터 > 메모리 > 하드디스크 순으로 속도가 빠르다 32bit / 64bit 시스템에서 말하는 비트 수는 명령을 한 번에 처리할 수 있는 레지스터의 비트 수이다. 32bit 시스템이 인식 가능한 메모리가 4GB 인 이유는 32bit 로 한 번에 표현할 수 있는 주소가 4GB 이기 때문이다. 최초의 16비트 시스템에서..
x86 메모리 구조 (8086 Memory Architecture) 1. 메모리 구조 1. 8086 시스템 메모리 구조 인텔 32비트 시스템, 8086 시스템의 메모리 구조는 위와 같다 커널 (Kernal) 영역 : OS의 시스템 코드가 로드 되는 부분이다. 건드릴 수 없는 영역이다 Off-Limit 영역 : 사용자가 커널 영역에 접근하지 못하도록 할당해둔 공간이다 유저 영역 : 유저가 실제 사용하는 영역이다. 코드, 스택, 힙 등이 포함된다 Null Pointer 할당 영역 : 모두 0이고 변경 불가능하다. 시스템 보호 차원에서 만들어둔 영역이다. 위의 메모리 구조는 윈도우 기준으로, 리눅스는 커널 (Kernal) 영역이 1GB 이다. 운영체제는 하나의 프로세스를 실행시키면 이 프로세스를 세그먼트 (s..
· Coding/C
[코딩도장] Unit 71 1. 파일 포인터 활용하기 (fseek, ftell) 1. 파일 포인터 이동하기 (fseek) fseek 함수는 기준점에서 이동할 거리(크기)를 지정하여 파일 포인터를 이동시킨다 fseek(파일포인터, 이동할크기, 기준점) fseek(fp, 0, SEEK_END); // 파일 포인터를 파일의 끝으로 이동시킴 fseek 의 기준점은 SEEK_SET 파일의 처음부터 시작 SEEK_CUR 현재 위치부터 이동 시작 SEEK_END 파일의 끝부터 시작 SEEK_SET, SEEK_CUR, SEEK_END는 기준점을 기준으로 파일 포인터의 위치를 바꾼다 fseek(fp, 0, SEEK_SET); 이면 파일의 처음으로 간다 fssek(fp, 0, SEEK_END); 이면 파일의 끝으로 간다 ..
· Coding/C
[코딩도장] Unit 70 1. 파일에 문자열 읽고 쓰기 (fprintf, fscanf) 1. 파일 포인터 사용하기 (fopen) C언어에서 파일을 사용하기 위해서는 fopen 함수로 파일을 열고 파일 포인터를 얻어야 한다 // ↓ 파일 포인터 FILE *fp = fopen("hello.txt", "w"); // hello.txt 파일을 쓰기 모드(w)로 열기. // ↑ ↖ 파일 모드 // 파일 포인터를 반환 // 파일 이름 또는 파일 경로 FILE 구조체는 stdio.h 헤더파일에 정의되어 있다 보통 FILE 과 * 를 합쳐서 파일 포인터라 부른다 파일 모드의 종류는 r 읽기 전용 - 파일을 읽기 전용으로 연다 (반드시 파일이 있어야 함) w 쓰기 전용 - 새 파일 생성 (파일이 있다면 내용을 덮어씀)..
· Coding/C
[코딩도장] Unit 66 ~ 67 1. 함수 가변인자 1. 함수에서 가변인자 사용하기 함수의 들어가는 인수(argument)의 개수가 변하는 것을 가변 인자(variable argument)라고 한다 함수에서 가변 인자를 정의할 때는 고정 매개변수가 한 개 이상 있어야 한다 고정 매개변수 뒤에 ... 를 붙여 가변 인자를 정의할 수 있다 반환값자료형 함수이름(자료형 고정매개변수, ...) { } ... 으로 들어온 가변 인자를 사용하려면 헤더 파일을 사용해야 한다 stdarg.h 에 정의된 가변 인자 처리 매크로는 아래와 같다 va_list 가변인자 목록(가변 인자의 메모리 주소를 저장하는 포인터) va_start 가변 인자를 가져올 수 있도록 포인터를 설정 va_arg 가변 인자 포인터에서 특정 자료..
· Coding/C
[코딩도장] Unit 63 ~ 65 1. 포인터 매개변수 1. 포인터 매개변수 사용하기 C언어에서 값을 여러개 반환하는 함수를 만들 때 포인터 매개변수를 사용한다 반환값자료형 함수이름(자료형 *매개변수1, 자료형 *매개변수2) { } ( ) 안에서 자료형 뒤에 * 를 붙여 매개변수를 포인터 형태로 만든다 void swapNumber(int *first, int *second) // 반환값 없음, int 포인터 매개변수 두 개 지정 { int temp; // 임시 보관 변수 // 역참조로 값을 가져오고, 값을 저장함 temp = *first; *first = *second; *second = temp; } 매개변수를 int *first, int *second 와 같이 포인터 형식으로 지정해준다 함수 안에서..
GunP4ng
GunP4ng