목록All (98)
개인노트
문제 1) 변수 num에 저장된 값의 제곱을 계산하는 함수를 정의하고 이를 호출하는 main 함수를 작성해보자.(함수 1. Call-By-Value 기반의 SquareByValue 함수 함수 2. Call-By-Reference 기반의 SquareByReference 함수) Q) 14-1_1.c #include int SquareByValue(int);void SquareByReference(int*, int); int main(void) { int num; printf("양의 정수를 입력하시오 : ");scanf_s("%d", &num);SquareByValue(num);printf("num의 값 1 : %d \n", num);SquareByReference(&num,num);printf("num의 값..
보통 함수에 인자를 전달한다고 하면 int main(void){int num=1, tistory=2;ifunc(num, tistory); } 이런 형식으로 해당 함수의 인자전달 부분에 변수명을 넣어준다.하지만 배열은 변수 명 대신 변수의 주소 값을 넣어준다. #include void showarr(int*, int);void addarr(int*, int, int); int main(void) {int arr[] = { 1,2,3,4,5 };addarr(arr, sizeof(arr) / sizeof(int), 1);showarr(arr, sizeof(arr) / sizeof(int)); addarr(arr, sizeof(arr) / sizeof(int), 2);showarr(arr, sizeof(arr)..
명령어 단축키 설명 Restart [Ctrl+F2] 다시 처음부터 디버깅한다.(디버깅 중인 프로세스를 종료하고 재실행하여 하던 작업이 종료된다.) Step Into [F7] 한개의 OP Code 실행(CALL 명령어를 만나면 그 함수의 코드 내부로 진입한다.) Step Over [F8] 한개의 OP Code 실행(CALL 명령어를 만나면 함수의 내부로 들어가지 않고 함수 자체를 실행한다.) Execute till Return [Ctrl+F9] 함수 코드 내에서 RETN 명령어까지 실행(함수 탈출)
디버깅을 시작하기 위해서는 전문적인 디버거를 사용해야한다. 디버거는 여러가지 종류가 있지만 여기서는 OllyDbg를 사용하기로 한다.OllyDbg는 한눈에 보기 쉬운 인터페이스 구조와 여러가지 Plugin을 사용할 수 있는 Win32 디버거이며 무료로 제공되고 가겹고 빨라 많이 사용된다.
[ 리버싱 엔지니어링(Reversing Engineering, RE: 역공학) 이란? ]기계장치 또는 시스템 의 구조, 기능, 동작 등을 분석하여 그 원리를 이해하여 단점을 보완하고 새로운 기능을 추가하는 일련의 작업이다. [ 리버싱 방법 ]실행 파일의 분석 방법에는 두 가지 방법으로 나뉜다. 정적 분석으로 정보를 수집하면서 프로그램의 구조와 동작 원리에 대해 예측 할 수 있다.1. 정적 분석 : 파일의 외관을 관찰하고 분석하는 방법이다. 파일의 종료, 크기, 헤더(PE)정보, 내부 문자열 등.. 다양한 내용을 확인하는 것이다. 디스어셈블러(Disassembler)를 이용하여 내부 코드와 구조를 확인 하는 것도 정적 분석 방법이다.2. 동적 분석 : 파일을 실행시켜서 행위를 분석하고 디버깅을 통하여 코드..
* 포인터 배열이란 ? 포인터 변수로 이루어져 주소 값의 저장이 가능한 배열을 '포인터 배열' 이라고 한다. Source.c #include int main(void) {int num1 = 10, num2 = 20, num3 = 30;int *arr[3] = { &num1,&num2,&num3 };int i; for (i = 0; i
char str1[] = "billnairk";- 변수 형태의 문자열 char *str2 = "billnairk";- 상수 형태의 문자열 #include int main(void) {char str1[] = "MS tistory"; // 변수 형태의 문자열char * str2 = "KMS billnairk"; // 상수 형태의 문자열 printf("%s, %s \n", str1, str2); str2 = "babo";// str2[0] = "A"; 불가능printf("%s, %s \n", str1, str2); getchar();} 다음 문장이 처리되는 과정 [ char *str2 = "billnairk"; ]1. 문자열이 메모리 공간에 저장된다.2. 메모리의 주소 값이 반환된다.즉, 문자열이 0x123..
문제 1.) 길이가 5인 int형 배열을 1,2,3,4,5로 선언 및 초기화 후 포인터 변수 ptr에 저장된 값을 증가시키는 형태의 연산을 기반으로 배열 요소에 접근 하면서 모든 배열 요소의 값을 2씩 증가 시킨 후 출력하여라. Q) 13-1_1.c #include int main(void) {int arr[] = { 1,2,3,4,5 };int *ptr = arr;int i; for (i = 0; i < 5; i++) {*ptr += 2;ptr++;} for (i = 0; i < 5; i++) {printf("%d 번째 배열의 값 : %d \n", i, arr[i]);}getchar();} 문제 2.) 문제 1과 달리 포인터 변수 ptr에 저장된 값을 변경시키지 않고 ptr을 대상으로 덧셈 연산을 하여..
배열의 이름은 포인터(메모리 주소값을 나타냄)이며 포인터 변수와는 달리 값을 바꿀 수 없는 상수형태의 포인터이다. Source.c #include int main(void) {int arr[] = { 1,2,3 };printf("배열의 이름 : %p \n", arr);printf("첫번째 요소 : %p \n", &arr[0]);printf("두번째 요소 : %p \n", &arr[1]);printf("세번째 요소 : %p \n", &arr[2]); getchar();} Source.c 1. 배열 이름의 주소 값과 배열의 첫번째 주소 값이 동일한 것을 알 수 있다. 2. 두번째 요소와 세번째 요소의 값의 차이가 4인것을 보아 'int형 배열 요소간 주소 값의 차는 4byte이다.' 3. 변수 앞에 기호 &..
문제 1. 아래의 예제 실행 시 포인터 변수와 변수의 관계를 그림으로 그린 후 출력의 결과를 말하여라. Q) 12-1_1.cint main(void) {int num = 10;int * ptr1 = #int * ptr2 = ptr1; (*ptr1)++;(*ptr2)++; printf("%d \n", num);getchar(); } 출력 결과 : num의 값은 2번 상승하여 12이다. 문제 2. int형 변수 num1, num2를 10과 20으로 선언 및 초기화 → int형 포인터 변수 ptr1, ptr2 선언 후 num1, num2를 가리킴 → 포인터 변수를 이용하여 num1은 10증가 num2는 10 감소 → ptr1과 ptr2이 가리키는 대상을 바꾸고 출력 하여라. Q) 12-1_2.c #in..