[P4C] C언어 코딩 도장 : 문제 풀이 6
2021. 3. 15. 00:19
Programming Languages/C
45.7 심사문제 : 문자열 자르기 문제 : 표준 입력으로 길이 60 이하의 인터넷 도메인이 입력됩니다. 점을 기준으로 문자열을 분리하여 각 줄마다 출력하세요. 정답 : #define _CRT_SECURE_NO_WARNINGS #include #include int main(void) { char s[61]; scanf("%s", s); char *ptr = strtok(s, "."); while (ptr != NULL) { printf("%s\n", ptr); ptr = strtok(NULL, "."); } return 0; } 45.8 심사문제 : 특정 단어 개수 세기 문제 : 표준 입력으로 길이 1,000 이하의 문자열이 입력됩니다. 입력된 문자열에서 "the"의 개수를 출력하는 프로그램을 만드세요..
[P4C] C언어 코딩 도장 : UNIT 45 ~ UNIT 47
2021. 3. 14. 12:54
Programming Languages/C
Unit 45. 문자열 자르기 45.1 문자를 기준으로 문자열 자르기 strtok 함수는 특정 문자를 기준으로 문자열을 자르는 방법이다. (string.h 헤더 파일에 선언되어 있음). strtok(대상문자열, 기준문자); #define _CRT_SECURE_NO_WARNINGS // strtok 보안 경고로 인한 컴파일 에러 방지 #include #include // strtok 함수가 선언된 헤더 파일 int main() { char s1[30] = "The Little Prince"; // 크기가 30인 char형 배열을 선언하고 문자열 할당 char *ptr = strtok(s1, " "); // " " 공백 문자를 기준으로 문자열을 자름, 포인터 반환 while (ptr != NULL) // 자..
[P4C] C언어 코딩 도장 : UNIT 41 ~ UNIT 44
2021. 3. 14. 00:59
Programming Languages/C
Unit 41. 문자열의 길이를 구하고 비교하기 41.1 문자열 길이 구하기 문자열의 길이는 strlen 함수로 구할 수 있다. (string.h 헤더 파일에 선언되어 있음). strlen(문자열포인터); strlen(문자배열); #include #include // strlen 함수가 선언된 헤더 파일 int main() { char *s1 = "Hello"; // 포인터에 문자열 Hello의 주소 저장 char s2[10] = "Hello"; // 크기가 10인 char형 배열을 선언하고 문자열 할당 printf("%d\n", strlen(s1)); // 5: strlen 함수로 문자열의 길이를 구함 printf("%d\n", strlen(s2)); // 5: strlen 함수로 문자열의 길이를 구함..
[P4C] C언어 코딩 도장 : 문제 풀이 5
2021. 3. 14. 00:07
Programming Languages/C
39.8 심사 문제 : 문자열 만들기 문제 : 표준 출력으로 다음과 같은 문자열이 출력되게 만드세요. Beethoven 9th Symphony 정답 : #include int main() { char s1[] = "Beethoven\n9th\nSymphony"; printf("%s\n", s1); return 0; } 40.8 심사문제 : 문자열 네 개 입력받기 문제 : 표준 입력으로 어떤 문자열 네 개가 입력됩니다(각 문자열의 길이는 30 이하). 입력된 문자열 네 개를 각각 한 줄씩 출력하는 프로그램을 만드세요. 정답 : #include int main(void){ char s1[31]; char s2[31]; char s3[31]; char s4[31]; scanf("%s %s %s %s", s1,..
[P4C] C언어 코딩 도장 : UNIT 39 ~ UNIT 40
2021. 3. 14. 00:05
Programming Languages/C
Unit 39. 문자열 사용하기 39.1 문자와 문자열 포인터 알아보기 문자열은 char 포인터 형식으로 사용한다. char *변수이름 = "문자열"; #include int main() { char c1 = 'a'; // 변수에 문자 'a' 저장 char *s1 = "Hello"; // 포인터에 문자열 "Hello"의 주소 저장 printf("%c\n", c1); // a: %c로 문자 출력 printf("%s\n", s1); // Hello: %s로 문자열 출력 return 0; } 문자는 1바이트 크기의 char에 저장할 수 있지만 문자열은 크기가 1바이트를 넘어서므로 char에 저장할 수 없다. 따라서 문자열은 변수에 직접 저장하지 않고 포인터를 이용해서 저장한다. 즉, 문자는 변수 c1 안에 그..
[P4C] 우리집에 GDB 있는데… 메모리 보고갈래? (3) 정리
2021. 3. 13. 02:09
Hacking/Pwnable
DEBUGGING (IDA, GDB 사용) 우리는 이미 tomato.c 소스가 있지만, 보통 소스는 잘 주지 않기에 없다는 가정하에 디버깅을 해보겠다. IDA로 취약점 발견 헥스레이라는 강력한 기능을 제공하는 디스어셈블러이다. 헥스레이는 바이너리를 디컴파일해서 원본 코드와 흡사한 소스를 떨궈준다. F5 단축키를 누르면 다음과 같이 디컴파일한 소스(pseudocode)가 나온다. IDA에서 8번째 라인을 보면, buffer overflow 취약점이 나는 것을 쉽게 확인할 수 있다. strcpy를 할 때 복사 버퍼의 길이를 검증하지 않기에 버퍼 크기인 10보다 더 넣어줘서 bof를 일으켜 num의 값을 1로 바꾸면 될 것으로 보인다. (strcpy는 버퍼 오버플로우 취약점이 발생할 가능성이 농후하기 때문에 ..
[P4C] 우리집에 GDB 있는데… 메모리 보고갈래? (2) 정리
2021. 3. 12. 19:03
Hacking/Pwnable
tomato.c 파일은 strcpy를 할 때 복사 버퍼의 길이를 검증하지 않기에 버퍼 크기인 10보다 더 넣어줘서 bof를 일으켜 num의 값을 1로 바꾸면 될 것으로 보인다. 그리고 실습 환경을 최대한 똑같이 해주기 위해 다음과 같이 몇 가지 보호 기법들을 해제해서 컴파일 해주었다. gcc -m32 -fno-stack-protector -mpreferred-stack-boundary=2 -fno-pie -o tomato tomato.c -fno-stack-protector 옵션을 포함하는 이유 gcc가 스택을 보호하기 위해 ‘canary’라는 것을 삽입한다. 함수 내에서 사용하는 스택 프레임과 return address 사이에 'canary'를 넣는 것이다. 그리고 Buffer Overflow가 발생해..
[P4C] 우리집에 GDB 있는데… 메모리 보고갈래? 정리
2021. 3. 11. 21:55
Hacking/Pwnable
메모리 주소 보통 노트북은 4GB의 램을 쓰는데, 4GB를 Byte 단위로 변환하면 2^32Byte이다. 그리고 1Byte는 주소공간 한 개의 크기이다. 즉, 4GB는 2^32개의 주소를 가질 수 있다. 또 한편, 1 bit는 0 또는 1의 값만 가질 수 있기에 32bit는 2^32만큼의 숫자를 표현할 수 있다. 32 bit 라는 것은 2^32개의 주소를 가지고 있다라는 뜻이다. 따라서 32bit 운영체제는 수 표현을 최대 2^32까지 밖에 못 하기 때문에, 8GB나 16GB의 램을 가지고 있다고 하더라도 접근을 할 수가 없다. 0000…0000(32개) 부터 1111….1111(32개) 까지를 보기 편하게 16진수로 변환하면? 00000000 ~ FFFFFFFF이다! 유저 영역, 커널 영역 시스템 운영..