[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..
[FTZ] 해커스쿨 FTZ level 10
2021. 3. 26. 20:58
Wargame/Hackerschool FTZ
hint를 확인한 모습이다. 힌트에 따르면 공유 메모리를 사용하여 만든 프로그램을 도청하는 것이 문제 핵심입니다. 공유메모리란? 공유 메모리는 IPC(Inter-Process Communication)의 한 가지 방법으로 프로세스간 통신이 필요할 경우 사용합니다. 공유 메모리를 통한 통신은 둘 이상의 프로세스가 공통 메모리에 액세스 할 수 있는 개념으로 한 프로세스에서 변경한 메모리 공간의 내용을 다른 프로세스에서 접근할 수 있습니다. ipcs -m 명령어를 통해 공유 메모리 세그먼트에 대해 알 수 있습니다. key는 7530 byte이며, 크기는 1028 byte입니다. 이제 공유메모리에 접근해서 프로그램을 도청해봅시다. 공유 메모리를 사용하지 위해서는 아래의 헤더파일을 include 해주어야 합니다...
[FTZ] 해커스쿨 FTZ level 9
2021. 3. 26. 19:32
Wargame/Hackerschool FTZ
문제 힌트를 확인한 결과입니다. fgets 함수를 통해 buf에 입력을 받는데, buf의 크기인 10보다 큰 40 byte 만큼 입력을 받고 있습니다. 따라서 버퍼 오버플로우가 발생합니다. 이때 우리의 목표는 level 10의 권한으로 쉘을 실행시키는 것으로, buf2의 값이 "go"일 때 level 10의 권한으로 "/bin/bash"가 실행됩니다. 따라서 버퍼 오버플로우를 통해 buf2의 값을 "go"로 변경하면 될 것으로 보입니다. 그럼 이제 offset을 구하고 payload를 작성해보겠습니다. Offset 구하기 gdb를 이용해 디버깅을 해보겠습니다. 그런데 /usr/bin/bof 파일에 gdb를 실행시키니 permission denied가 뜹니다. 그래서 hint에서 주었던 소스 코드를 가지고..
[FTZ] 해커스쿨 FTZ level 8
2021. 3. 23. 23:13
Wargame/Hackerschool FTZ
힌트를 확인한 결과입니다. shadow 파일이란? 패스워드를 암호화 하여 보호하기 위해 만들어진 것으로 기존의 /etc/passwd 파일에 있던 비밀번호를 shadow 파일에 암호화하여 저장하게 됩니다. 이이 파일은 일반적으로 root 만의 접근 권한이 존재합니다. 또한 패스워드에 대한 마료 갱신기간, 최소 기간 등의 시간상의 관리 정책을 저장하고 있습니다. 힌트대로 level 9의 shadow 파일을 찾기 위해 용량이 2700인 파일을 찾는 find 명령어를 사용합니다. find / -size 2700c 2>/dev/null find 명령어를 통해 /etc/rc.d/found.txt라는 txt 파일이 나옵니다. cat 명령어를 통해 이 파일을 읽어보니 level 9의 shadow 파일임을 알 수 있었습..