[P4C] C언어 코딩 도장 : 문제 풀이 4
2021. 3. 5. 16:47
Programming Languages/C
34.10 심사 문제 : 포인터와 주소 연산자 사용하기 문제 : 표준 입력으로 정수가 입력됩니다. 다음 소스 코드를 완성하여 입력된 정수가 출력되게 만드세요. 정답 : #define _CRT_SECURE_NO_WARNINGS #include int main() { int* numPtr1; int** numPtr2; int num1; scanf("%d", &num1); numPtr1 = &num1; numPtr2 = &numPtr1; printf("%d\n", **numPtr2); return 0; } 34.10 심사 문제 : 포인터와 주소 연산자 사용하기 문제 : 표준 입력으로 두 정수가 입력됩니다(입력 값의 범위는 0~1073741824). 다음 소스 코드를 완성하여 입력된 두 정수의 합이 출력되게 만..
[HackCTF] Basic_Bof #1
2021. 3. 4. 14:03
Wargame/HackCTF
1. 문제 의도 파악 우선 v5 값이 0xDEADBEEF일 때 쉘을 획득할 수 있으니 v5 값을 변경하면 된다. 어떻게 값을 변경할 수 있을까 찬찬히 살펴보니 다음과 같은 결론이 나왔다. 우선 gets 함수로 배열 s에 입력을 받고 있는데, 배열의 크기인 40보다 더 큰 45 바이트로 입력을 받고 있다. 따라서 buffer overflow 공격을 통해 배열 s를 넘치게 해서 v5 값을 변경할 수 있을 것이다. 2. offset 구하기 디버깅을 하지 않고 ida를 통해 간단하게 offset을 얻었다. 배열 s의 주소가 ebp-52이고 v5의 주소가 ebp-12이니, offset은 40이다. 따라서 40만큼을 dummy 값으로 채우고 그 이후부터 0xDEADBEEF(변경해야 할 값)로 채우면 된다. payl..
[P4C] C언어 코딩 도장 : UNIT 38
2021. 3. 3. 21:27
Programming Languages/C
Unit 38. 포인터와 배열 응용하기 배열의 크기를 동적으로 지정하려면 어떻게 해야 할까? 크기를 동적으로 지정하려면 포인터를 선언하고 메모리를 할당한 뒤 메모리를 배열처럼 사용해야 한다. 38.1 포인터에 할당된 메모리를 배열처럼 사용하기 포인터에 malloc 함수로 메모리를 할당해주면 포인터를 배열처럼 사용할 수 있다. - 자료형 *포인터이름 = malloc(sizeof(자료형) * 크기); #include #include // malloc, free 함수가 선언된 헤더 파일 int main() { int *numPtr = malloc(sizeof(int) * 10); // int 10개 크기만큼 동적 메모리 할당 numPtr[0] = 10; // 배열처럼 인덱스로 접근하여 값 할당 numPtr[9..
[P4C] C언어 코딩 도장 : UNIT 37
2021. 3. 3. 18:52
Programming Languages/C
Unit 37. 2차원 배열 사용하기 37.1 2차원 배열을 선언하고 요소에 접근하기 2차원 배열은 [ ] (대괄호)를 두 번 사용하여 선언하며 첫 번째 대괄호에는 세로 크기, 두 번째 대괄호에는 가로 크기를 지정한다. - 자료형 배열이름[세로크기][가로크기]; - 자료형 배열이름[세로크기][가로크기] = { { 값, 값, 값 }, {값, 값, 값} }; 2차원 배열의 요소에 접근하려면 배열 뒤에 [ ] (대괄호)를 두 번 사용하며 [ ] 안에 세로와 가로 인덱스를 지정해주면 된다. - 배열[세로인덱스][가로인덱스] #include int main() { int numArr[3][4] = { // 세로 크기 3, 가로 크기 4인 int형 2차원 배열 선언 { 11, 22, 33, 44 }, { 55, 6..
[P4C] C언어 코딩 도장 : UNIT 36
2021. 3. 3. 18:33
Programming Languages/C
Unit 36. 배열 사용하기 배열은 같은 자료형의 변수를 일렬로 늘어놓은 형태이며 반복문과 결합하면 연속적이고 반복되는 값을 손쉽게 처리할 수 있다. 36.1 배열을 선언하고 요소에 접근하기 배열은 변수 이름 뒤에 [ ] (대괄호)를 붙인 뒤 크기를 설정한다. 그리고 배열을 선언하면서 값을 초기화할 때는 { } (중괄호)를 사용한다. - 자료형 배열이름[크기]; - 자료형 배열이름[크기] = { 값, 값, 값 }; #include int main() { int numArr[10] = { 11, 22, 33, 44, 55, 66, 77, 88, 99, 110 }; // 배열을 생성하고 값 할당 printf("%d\n", numArr[0]); // 11: 배열의 첫 번째(인덱스 0) 요소 출력 printf..
[P4C] C언어 코딩 도장 : UNIT 35
2021. 3. 3. 16:00
Programming Languages/C
5[P4C] C언어 코딩 도장 : UNIT 35 이번에는 malloc 함수를 이용해 포인터에 원하는 만큼 메모리 공간을 할당받아 사용하는 방법을 알아보겠다. malloc → 사용 → free 패턴으로 사용할 수 있다. Unit 35.1 메모리 할당하기 메모리를 사용하려면 malloc 함수로 사용할 메모리 공간을 확보해야 한다(memory allocation). 이때 필요한 메모리 크기는 바이트 단위로 지정한다(메모리 할당, 해제 함수는 stdlib.h 헤더 파일에 선언되어 있다). - 포인터 = malloc(크기); #include #include // malloc, free 함수가 선언된 헤더 파일 int main() { int num1 = 20; // int형 변수 선언 int *numPtr1; //..
[P4C] C언어 코딩 도장 : UNIT 34
2021. 3. 3. 00:56
Programming Languages/C
Unit 34. 포인터 사용하기 변수는 컴퓨터의 메모리에 생성된다. 메모리에 일정한 공간을 확보해두고 원하는 값을 저장하거나 가져오는 방식이다. 보통 변수는 메모리의 특정 장소에 위치하고 있으므로 메모리 주소로도 표현할 수 있다. 변수의 메모리 주소를 구할 때는 변수 앞에 & (주소 연산자)를 붙이면 된다. #include int main() { int num1 = 10; printf("%p\n", &num1); // 008AF7FC: num1의 메모리 주소를 출력 // 컴퓨터마다, 실행할 때마다 달라짐 return 0; } 메모리 주소는 008AF7FC과 같이 16진수 형태이며 printf에서 서식 지정자 %p를 사용하여 출력한다. 물론 16진수로 출력하는 %x, %X를 사용해도 된다. 34.1 포인터..
[Pwnable ] Return Address Overwrite 실습
2021. 3. 1. 14:03
Hacking/Pwnable
스택 버퍼 오버플로우 취약점이 있을 때에는 주로 스택의 리턴 주소를 덮는 공격을 한다. 리턴 주소는 함수가 끝나고 돌아갈 이전 함수의 주소로, 스택에 저장된 리턴 주소를 다른 값으로 바꾸면 실행 흐름을 조작할 수 있다. 다음은 스택 버퍼 오버플로우를 실습할 example.c이다. example1.c에서는 프로그램의 argv[1]을 vuln 함수의 인자로 전달한다. vuln 함수에서는 src 버퍼를 buf 버퍼에 strcpy 함수를 이용해 복사한다. strcpy 함수는 피복사 버퍼에 대한 길이 검증이 없기 때문에, 프로그램의 첫 번째 인자에 buf 배열의 크기보다 긴 문자열을 넣으면 스택 버퍼 오버플로우가 발생한다. ※ 그럼 지금부터 vuln 함수의 인자를 전달할 때 buf 버퍼보다 크기가 큰 배열을 전달..