p4c

Unit 39. 문자열 사용하기 전부터 느껴왔던 건데 이상하게 c언어에는 string, str 같은 자료형이 없다. char로 문자열을 넣고 실행하면 실행 오류가 뜨는데, 이번 Unit에서는 c언어로 문자열을 저장하는 방법에 대해 다룬다. -문자열 사용- 문자열을 사용하는 방법은 char를 포인터 형식으로 사용하면 된다. char * = ""; #include int main() { char *a = "Hello dypar!"; // 포인터 a에 Hello dypar! 문자열 저장 printf("%s", a); // a의 문자열 저장 } 위처럼 char를 포인터형으로 선언하고 출력 시 서식 지정자를 %s로 지정해주면 문자열이 그대로 출력된다. 1바이트인 char형에 문자열을 저장할 수 있는 원리는 바로 ..
우리 집에 GDB 있는데 메모리 보고 갈래? (3) 3에서는 소스 파일이 없다 가정한 상태로 ida, gdb를 이용해 취약점을 찾고 exploit을 진행한다. 보통 정적 분석은 ida, 동적 분석은 gdb를 활용한다고 한다. ida hexray가 제대로 작동하지 않아서 (完)우리집에 GDB 있는데… 메모리 보고갈래?(3)의 사진을 참고했다. 보면 거의 비슷하게 코드가 디컴파일 된 것을 볼 수 있다. ㄷㄷ 보면 strcpy로 인자로 입력된 문자열을 v4에 넣어주는데, argv[1]을 복사할 때 버퍼를 검사하는 로직이 없다. v4, v5는 지역 변수이므로 스택에 있기에 스택 오버플로우가 일어날 수 있는 것이다. v5가 1이 되면 쉘을 열 수 있으므로 스택 오버플로우로 v5의 값에 접근하면 될 것 같다. gd..
우리 집에 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 =..
dyp4r
'p4c' 태그의 글 목록 (4 Page)