[P4C] C언어 코딩 도장 : 문제 풀이 8
2021. 4. 3. 00:56
Programming Languages/C
56.6 심사 문제 : 구조체로 플래그 비트 필드 만들기 문제 : 다음 소스 코드를 완성하여 15 127 7이 출력되게 만드세요. 정답 : #include struct Flags { unsigned int a : 4; unsigned int b : 7; unsigned int c : 3; }; int main() { struct Flags f1; f1.a = 0xffffffff; f1.b = 0xffffffff; f1.c = 0xffffffff; printf("%u %u %u\n", f1.a, f1.b, f1.c); return 0; } 56.6 심사 문제 : 구조체로 플래그 비트 필드 만들기 문제 : 다음 소스 코드를 완성하여 57412가 출력되게 만드세요. 정답 : #include struct Fla..
[P4C] C언어 코딩 도장 : UNIT 56 ~ UNIT 57
2021. 4. 3. 00:29
Programming Languages/C
Unit 56. 구조체 비트 필드 사용하기 구조체 비트 필드를 사용하면 구조체 멤버를 비트 단위로 저장할 수 있다. CPU나 기타 칩의 플래그를 다루는 저수준(low level) 프로그래밍을 할 때 기본 자료형보다 더 작은 비트 단위로 값을 가져오거나 저장하는 경우가 많아 구조체 비트 필드가 유용하게 사용된다. 56.1 구조체 비트 필드를 만들고 사용하기 대부분의 컴파일러에서는 모든 정수 자료형을 사용할 수 있다. 보통은 비트 필드에 부호 없는(unsigned) 자료형을 주로 사용한다. 단, 실수 자료형은 비트 필드로 사용할 수 없다. 비트 필드는 다음과 같이 멤버를 선언할 때 : (콜론) 뒤에 비트 수를 지정해주면 된다. struct 구조체이름 { 정수자료형 멤버이름 : 비트수; }; #include ..
[Pwnable.kr] 3번 bof
2021. 4. 1. 17:31
Wargame/Pwnable.kr
func() 함수에서 gets 함수를 통해 입력을 받는데, 입력 크기를 지정하지 않아 버퍼의 크기인 32 byte 보다 더 입력을 받아 overflow가 발생하는 모습이다. 오버 플로우를 통해 key 값을 0xcafebabe로 바꿔주면 쉘을 실행할 수 있을 것이다. 그렇다면 offset을 구해보도록하자. func() 함수에서 두번째 call 하는 부분이 gets 함수가 실행되는 부분이다. 이때, overflowme를 인자값으로 주기 때문에 코드 위쪽을 보면 overflowme의 주소를 알 수 있다. ebp - 0x2c로 ebp로부터 44만큼 떨어져 있다. 따라서 offset은 44 + 4(SFP) + 4(RET) = 52이다. 따라서 payload는 다음과 같을 것이다. "A"*52 + "\xbe\xba..
[Pwnable.kr] 2번 collision
2021. 4. 1. 17:06
Wargame/Pwnable.kr
접속을 해서 file들을 확인하니 col, col.c, flag 파일이 있다. hackctf에서 본 적이 있는 유형이다. argv[1]으로 인자를 받아 check_password()의 인자로 넘겨주는데, check_password()의 반환값과 hashcode 값이 동일할 경우 flag 파일을 볼 수 있다. check_password()의 경우 받은 인자를 int형 포인터로 형변환해 for 문을 돌려준다. for 문을 돌리면서 4바이트씩 참조를 해 res에 값을 누적시키고 마지막에 res를 반환한다. 그리고 반환된 res와 hashcode 값(0x21DD09EC)과 동일하면 된다. 그렇기에 hashcode 값을 5로 나눠주고 그 값을 5개 붙이면 될 듯하다. 그런데 hashcode 값이 딱 나누어 떨어지..
[Pwnable.kr] 1번 fd
2021. 4. 1. 14:55
Wargame/Pwnable.kr
우분투에서 ssh로 접속해보겠다. flag 파일을 보려고 했지만, Permission denied가 떴다. 아무래도 root만 볼 수 있을 듯 하다. 그래서 fd.c 소스 파일을 확인해보았다. 우리의 목표인 flag 파일을 보기 위해선 read를 통해 표준 입력으로 LETMEWIN을 입력해주어야 할 것이다. 따라서 fd 값을 0으로 만들기 위해 argv[1]에 해당하는 인자값으로 0x1234를 10진수인 4660으로 넣어준다. 그리고 난 뒤 buf에 LETMEWIN을 입력하면 될 것이다. FD(File Descriptor) 파일디스크립터 목적 POSIX 이름 stdio 스트림 0 표준 입력 STDIN_FILENO stdin 1 표준 출력 STDOUT_FILENO stdout 2 표준 에러 STDEFF_F..
[P4C] C언어 코딩 도장 : UNIT 54 ~ UNIT 55
2021. 3. 28. 19:33
Programming Languages/C
Unit 54. 공용체 사용하기 공용체는 구조체와 정의 방법이 같지만 멤버를 저장하는 방식이 다르다. 구조체는 멤버들이 각각 공간을 차지하지만 공용체는 모든 멤버가 공간을 공유한다. 54.1 공용체를 만들고 사용하기 공용체는 union 키워드를 사용하여 정의한다. union 공용체이름 { 자료형 멤버이름; }; 공용체는 정의만 해서는 사용을 할 수가 없다. 따라서 공용체도 변수로 선언해서 사용한다. union 공용체이름 변수이름; #define _CRT_SECURE_NO_WARNINGS // strcpy 보안 경고로 인한 컴파일 에러 방지 #include #include // strcpy 함수가 선언된 헤더 파일 union Box { // 공용체 정의 short candy; // 2바이트 float sn..
[P4C] C언어 코딩 도장 : 문제 풀이 7
2021. 3. 28. 17:27
Programming Languages/C
51.6 심사문제 : 암호화 헤더 크기 구하기 문제 : 다음 소스 코드를 완성하여 12가 출력되게 만드세요. 구조체 멤버의 이름은 마음대로 지어도 됩니다. 정답 : #include struct EncryptionHeader { char flags; int version; int number; }; int main() { struct EncryptionHeader header; printf("%d\n", sizeof(header)); return 0; } 51.7 심사문제 : 패킷 크기 조절하기 문제 : 다음 소스 코드를 완성하여 3이 출력되게 만드세요. 구조체 멤버의 이름은 마음대로 지어도 됩니다. 정답 : #include struct Packet { char a; char b; char c; }; in..
[P4C] C언어 코딩 도장 : UNIT 51 ~ UNIT 53
2021. 3. 28. 16:48
Programming Languages/C
Unit 51. 구조체 멤버 정렬 사용하기 51.1 구조체 크기 알아보기 구조체의 전체 크기는 sizeof 연산자를 사용하면 알 수 있다. sizeof(struct 구조체) sizeof(구조체별칭) sizeof(구조체변수) sizeof 구조체변수 다음은 가상의 네트워크 패킷 구조체 PacketHeader를 정의해서 멤버의 크기와 구조체의 크기를 구하는 코드이다. #include struct PacketHeader { char flags; // 1바이트 int seq; // 4바이트 }; int main() { struct PacketHeader header; printf("%d\n", sizeof(header.flags)); // 1: char는 1바이트 printf("%d\n", sizeof(heade..