p4c

우리 집에 GDB 있는데 메모리 보고 갈래? (2) #include #include void func2() { puts("func2()"); // "func2()"를 출력 } void sum(int a, int b) { // int형 매개 변수 a, b를 받음 printf("sum : %d\n", a+b); // 더한 값을 출력 func2(); // func2 함수 실행 } int main(int argc, char *argv[]) { int num=0; char arr[10]; sum(1,2); // sum 함수에 인자 1, 2를 보냄 strcpy(arr,argv[1]); // 실행시 입력 받은 인자를 arr로 복사(취약점 발생!!) printf("arr: %s\n", arr); // arr 출력 if..
우리 집에 GDB 있는데 메모리 보고 갈래? (1) 위 사진이 바로 우리 집에 GDB 있는데 메모리 보고 갈래? (1)에서 다룰 내용의 사진이다. 1에서는 주소, 메모리 영역에 대해서 다룬다. -Address- 32bit 노트북을 보면 램이 4gb 밖에 없다. 그 이유는 위 사진처럼 4gb 램은 이런 저런 복잡한 수식을 거쳐서 2^32Byte의 주소를 가질 수 있는데, 32bit의 경우 1bit는 0, 1을 가질 수 있으므로 2^32, 즉 최대 2^32 Byte의 주소를 가질 수 있기 때문에 2^32 Byte의 주소를 넘어가게 되는 4gb 초과로는 인식하지 못하는 것이다. 리버싱을 공부해보면 주소가 00000000 ~ FFFFFFFF까지 존재하다는 점을 알 수 있는데, 이는 이진수 주소 0000...(3..
· Wargame/FTZ
FTZ 로컬 환경을 구축하고 putty를 사용해서 접속을 시도했지만 잘 되지 않았다. 여러가지를 시도해보다가 vm network 설정을 nat에서 bridge로 바꾸니 잘 접속이 됐다. 참고로 한글이 깨지는 경우는 putty -> category -> Translation -> remote character set을 UTF-8로 바꿔주면 된다. Write Up은 하나하나 따라가며 적기보다는 해당 level의 목적, 배우는 것에 초점을 둬서 정리하겠다. -trainer1- 위는 리눅스를 사용하거나 telnet으로 리눅스 서버로 접속을하면 볼 수 있는 프롬프트다. 프롬프트의 맨 앞 trainer1 부분은 접속 ID, 두 번째 부인 ftz는 서버, 마지막 trainer1은 현재 위치를 뜻한다. 이 프롬프트라는..
10진수를 2진수로 변환해서 출력하는 것이 목적이다. 배열을 활용한 풀이도 가능하지만 포인터와 동적할당을 이용해서 풀이하겠다. #define _CRT_SECURE_NO_WARNINGS #include #include int main() { int dec, count = 0; scanf("%d", &dec); // 10진수 값을 담을 변수 선언 및 입력, 2진수 자릿수를 담을 변수 선언 char *bin = malloc(sizeof(char) * 100); // char의 크기 * 100만큼 메모리 동적 할당 while (1) { bin[count] = dec % 2; dec /= 2; count++; if (dec == 0) break; // 매 반복마다 dec을 2로 나눈 나머지를 bin의 count ..
입력된 크기만큼의 2차원 배열을 만들고 세로 방향으로 1,2,3,4... 요소를 넣어 출력하는 것이 목적이다. 포인터 학습이 주 목적이므로 포인터, 메모리 동적할당을 사용해 풀이하겠다. #define _CRT_SECURE_NO_WARNINGS #include #include int main() { int **p; int n; scanf("%d", &n); // 2차원 배열 이중 포인터 선언, 크기를 담을 변수 선언 및 입력 p = malloc(sizeof(int*) * n); for (int i = 0; i < n; i++) { p[i] = malloc(sizeof(int) * n); } // 크기만큼 메모리를 확보하고 그 주소들을 p에 저장 int count = 1; // 배열에 넣어줄 값 for (i..
이 문제는 6주차 때 이미 풀었던 문제지만 비효율적으로 입력 최대 크기(100 100)만큼 배열을 생성해서 풀었고 또한 잘못 이해를 해서 푼 부분이 있기에 포인터와 동적할당을 이용한 방법과 올바르게 풀고자 선정하였다. 입력된 격자판의 세로, 가로, 막대의 개수, 막대의 길이, 방향, 좌표(x,y)를 바탕으로 격자판에 막대들을 둔 상태로 격자판을 출력하는 것이 목적이다. #define _CRT_SECURE_NO_WARNINGS #include #include int main() { int **board; // 격자판 배열 int xCount, yCount, count, len, direct, x, y; // xCount : 격자판 가로 yCount : 격자판 세로 count : 막대의 개수 len : 막대..
문자열과 시작 위치, 끝 위치가 입력된다. 입력 받은 문자열에서 시작 위치 ~ 끝 위치까지 출력하는 것이 목적이다. 단 배열 대신 동적 메모리 할당 방법(malloc, free)를 사용해서 풀어야한다. 배열이 안되니 배열 포인터를 만들어서 풀면 될 것 같다. #define _CRT_SECURE_NO_WARNINGS #include #include int main() { int a, b; // 시작 위치 끝 위치를 입력 받을 변수 char *p = malloc(sizeof(char) * 100); // malloc으로 char의 크기 * 100만큼 메모리를 할당한 후 그 주소를 포인터 p에 저장 scanf("%s", p); scanf("%d %d", &a, &b); // 문자열을 p의 주소에 저장, 시작 ..
두 수를 a, b 변수에 입력 받은 후 void형 myswap 함수를 작성해 a의 값이 b 값보다 크다면 두 변수의 값이 서로 바뀌도록 하는 것이 목적이다. myswap 함수를 작성해야하는데, 주어진 코드를 보면 myswap의 인자로 변수의 값이 아닌 변수의 주소가 주어진다. 이 주소를 포인터로 입력 받아 역참조해 값을 서로 바꿔주면 될 것 같다. #define _CRT_SECURE_NO_WARNINGS #include void myswap(int *A, int *B) { // int형 포인터 매개변수 A, B로 a, b의 메모리 주소를 전달 받음 if (*A < *B) return; // 역참조로 A가 가리키는 주소의 값이 B가 가리키는 주소의 값보다 작은지 확인하고 작으면 함수 종료 int tmp =..
-keyword- 1, 2, 3차원 배열, 1, 2, 3차원 배열 포인터, 다차원 배열 포인터 메모리 동적 할당 Unit 36. 배열 사용하기 -배열(Array)- c언어의 배열은 파이썬의 list와 비슷한 기능을 한다. 여러 값들을 한 변수에 저장하는 것이다. 파이썬과 똑같이 0부터 시작하는 인덱스를 갖고 여러 개의 값을 한 변수에 사용이 가능하다. 단 파이썬과 달리 c언어에서의 배열은 같은 자료형의 값들만 저장할 수 있다. 이 배열은 파이썬과 비슷하게 반복문으로 값을 한꺼번에 저장하거나 빼낼 때 주로 사용한다. 앞서 코드업에서 바둑판, 격자판 등도 이 배열을 이용해서 풀었다. 사용은 [] = {};로 한다. 꼭 배열을 선언하자마자 크기만큼 값들을 넣어줄 필요 없이 선언만 하고 나중에 값들을 넣어줘도 ..
// 날짜 대신 Unit 명을 써주고 문제들은 맨 아래에 모아서 풀이를 적어봤습니다. -keyword- 포인터, 역참조, 메모리 할당, malloc, free, 스택, 힙, memset Unit 34. 포인터 사용하기 -포인터(pointer)- 포인터란 c언어에서 메모리 주소값을 저장하는 변수다. 포인터 변수라고도 부른다.(참고 : tcpschool) int a = 1; 위는 간단하게 1로 초기화되는 int형 변수 a를 선언한 코드다. 사실 변수를 선언했을 때 마법처럼 짠하고 변수가 생성되는게 아닌 컴퓨터의 메모리에 일정 공간을 확보해서 그 공간에 변수의 값을 저장하고 가져오는 것이다. 이 메모리에서 해당 변수의 주소(위치)를 메모리 주소라고한다. 즉 위 int a = 1;이라는 코드가 실행될 때 컴퓨터..
dyp4r
'p4c' 태그의 글 목록 (4 Page)