[Tasks] 운영체제 HW3
💼

[Tasks] 운영체제 HW3

카테고리
📒 Assignment
작성자
박용성박용성
작성일
2024년 06월 02일
태그
C
Make
Slug
task-os-3
📎 Notion 링크🖥️ 과제 개요📌 문제 해결 준비사항 (구동 환경)1. Ubuntu 22.04 설치2. SSH 설정 진행3. 권한 부여4. 필수 패키지 설치5. 프로그램 실행 되는지 확인🙋‍♂️ Trouble Shooting #1💡 #1 해결 : amd64 환경을 설치하는 것으로 해결했습니다.6. 커널 다운로드, 압축 해제📌 문제 해결 과정 (수행 과정)1. Makefile에 이름 추가 (조건 1: 커널 명에 자신 이름 포함)2. 컴파일 위한 config 파일 복사3. Attack_on_POSIX 을 죽일 시스템 콜 선언시스템 콜을 컴파일하기 쉽도록 kernel 폴더에 코드 파일을 넣었습니다.4. kernel 폴더 내부의 Makefile 내용 추가5. 시스템 콜 경로 추가🙋‍♂️ Trouble Shooting #2💡 #2 해결 : 우분투를 재설치하고 arm64 식으로 시스템 콜을 추가했습니다.5-1. /usr/src/linux-6.5/arch/arm64/include/asm/unistd.h5-2. /usr/src/linux-6.5/include/uapi/asm-generic/unistd.h5-3. /usr/src/linux-6.5/arch/arm64/include/asm/unistd32.h5-4. /usr/src/linux-6.5/kernel/sys_ni.c5-5. /usr/src/linux-6.5/include/linux/syscalls.h5-6. /usr/src/linux-6.5/arch/microblaze/kernel/syscall_table.S6. make menuconfig 수행6-1. binfmt_misc 지원하기 위해 Kernel support for MISC binaries 활성화7. 본격적으로 make 수행7-1. 아래 명령어로 코어 수 알아두기7-2. make 순서대로 수행8. 커널 실행🙋‍♂️ Trouble Shooting #3💡 #3 해결 : RAM을 늘려주라 해서 8GB로 늘렸더니 부팅이 되었습니다.9. test.c 생성📌 결과 출력1. uname –r 명령 실행 화면2. 공격 프로세스 실행 중이 아닐 때의 시스템콜 커널 메시지3. 공격 프로세스 실행 중일 때의 시스템콜 커널 메시지4. 테스트 화면 (공격 프로세스 실행 중)💡 시행착오📚 참고자료

📎 Notion 링크

💡
PDF로 내보내면 사진이 잘려 notion 링크 첨부해드립니다.

🖥️ 과제 개요

Ubuntu 22.04 ARM 환경에서 Attack_on_POSIX 프로세스를 종료할 수 있는 System call 을 커널에 직접 삽입하고 컴파일한 후, 커널을 변경해 시스템 콜을 사용할 수 있도록 합니다.

📌 문제 해결 준비사항 (구동 환경)

💡
중간중간 막히는 부분에서 포맷하고 다시 진행해서 사진이 다른 구간이 존재합니다!

1. Ubuntu 22.04 설치

notion image
notion image
notion image
 

2. SSH 설정 진행

sudo apt update sudo apt install build-essential vim openssh-server net-tools
notion image
sudo systemctl enable ssh sudo systemctl start ssh
notion image
sudo vi /etc/ssh/sshd_config
notion image
notion image

3. 권한 부여

sudo chown -R {유저네임} .

4. 필수 패키지 설치

sudo apt install build-essential libncurses5 libncurses5-dev bin86 libssl-dev bison flex libelf-dev
notion image

5. 프로그램 실행 되는지 확인

# ssh 환경에서 실행되지 않는다면 이렇게 하면 됩니다. sudo chown -R {사용자 이름} .

🙋‍♂️ Trouble Shooting #1

bash: ./Attack_on_POSIX: cannot execute binary file: Exec format error
💡
arm64 환경이라 x86-64 환경의 프로그램이 실행되지 않았습니다.
notion image

💡 #1 해결 : amd64 환경을 설치하는 것으로 해결했습니다.

sudo vi /etc/apt/sources.list deb http://archive.ubuntu.com/ubuntu/ jammy main restricted universe multiverse deb http://archive.ubuntu.com/ubuntu/ jammy-updates main restricted universe multiverse deb http://archive.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse deb http://archive.ubuntu.com/ubuntu/ jammy-backports main restricted universe multiverse # 서버는 되는거 둘 중 아무거나! deb [arch=amd64] http://archive.ubuntu.com/ubuntu jammy main restricted universe multiverse deb [arch=amd64] http://archive.ubuntu.com/ubuntu jammy-updates main restricted universe multiverse deb [arch=amd64] http://archive.ubuntu.com/ubuntu jammy-security main restricted universe multiverse deb [arch=amd64] http://archive.ubuntu.com/ubuntu jammy-backports main restricted universe multiverse deb [arch=amd64] http://kr.archive.ubuntu.com/ubuntu/ jammy main restricted deb [arch=amd64] http://kr.archive.ubuntu.com/ubuntu/ jammy-updates main restricted deb [arch=amd64] http://kr.archive.ubuntu.com/ubuntu/ jammy-security main restricted deb [arch=amd64] http://kr.archive.ubuntu.com/ubuntu/ jammy-backports main restricted
notion image
sudo apt update sudo apt install qemu qemu-user qemu-user-static binfmt-support sudo update-binfmts --enable qemu-x86_64 sudo apt update sudo apt install gcc-x86-64-linux-gnu libc6-dev-amd64-cross sudo dpkg --add-architecture amd64 sudo apt-get update sudo apt-get install libc6:amd64 libncurses5:amd64 libstdc++6:amd64 sudo apt-get install binutils:amd64
notion image
 

6. 커널 다운로드, 압축 해제

cd /usr/src sudo wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.5.tar.xz sudo tar -xvf linux-6.5.tar.xz cd linux-6.5
notion image
 

📌 문제 해결 과정 (수행 과정)

1. Makefile에 이름 추가 (조건 1: 커널 명에 자신 이름 포함)

  • Makefile 에서 EXTRAVERSION 이름 변경
    • notion image

2. 컴파일 위한 config 파일 복사

cp /boot/config-$(uname -r) .config # 아래 두 줄을 수정 CONFIG_SYSTEM_TRUSTED_KEYS="debian/canonical-certs.pem" -> CONFIG_SYSTEM_TRUSTED_KEYS="" CONFIG_SYSTEM_REVOCATION_KEYS="debian/canonical-certs.pem" -> CONFIG_SYSTEM_REVOCATION_KEYS=""
notion image

3. Attack_on_POSIX 을 죽일 시스템 콜 선언

/usr/src/linux-6.5/kernel

시스템 콜을 컴파일하기 쉽도록 kernel 폴더에 코드 파일을 넣었습니다.

  • SYSCALL_DEFINE0 을 사용해 인자를 받지 않는 시스템 콜을 정의했습니다.
  • 또한 과제에서 제시된 for_each_processget_task_comm 함수를 사용했습니다.
notion image
#include <linux/sched/signal.h> // 시그널 전송 기능 #include <linux/kernel.h> // 커널 관련 기능 #include <linux/sched.h> // 스케줄러 관련 기능, for_each_process #include <linux/syscalls.h> // 시스템콜 관련 기능, SYSCALL_DEFINE0 SYSCALL_DEFINE0(kill_attack_on_posix) { struct task_struct *task; // 프로세스 정보 저장 char taskName[TASK_COMM_LEN]; // 프로세스 이름 저장 // TASK_COMM_LEN은 상수, 보통 16으로 정의되어 있음 bool flag = false; // 찾았는지 못찾았는지 플래그 정의 // 모든 프로세스를 순회 for_each_process(task) { get_task_comm(taskName, task); // 실행 중 프로세스 이름 가져옴 if (strcmp(taskName, "Attack_on_POSIX") == 0) { flag = true; send_sig(SIGKILL, task, 0); // 종료 시그널 보냄 printk(KERN_INFO "Clear\n"); // 로그에 Clear 출력 break; } } if (!flag) { // 못찾았으면 Safe now 출력 printk(KERN_INFO "Safe now\n"); } return 0; }
 

4. kernel 폴더 내부의 Makefile 내용 추가

kill_attack_on_posix.o
notion image

5. 시스템 콜 경로 추가

🙋‍♂️ Trouble Shooting #2

x86_64 기준으로 처음에 시스템 콜을 삽입했다가 실패했습니다.
/usr/src/linux-6.5/include/linux/syscalls.h /usr/src/linux-6.5/arch/x86/entry/syscalls/syscall_64.tbl

💡 #2 해결 : 우분투를 재설치하고 arm64 식으로 시스템 콜을 추가했습니다.

또한 처음에 system call 번호를 628 로 설정하고 전체 시스템 콜 수도 늘려주었는데 실행되지 않아 마지막 system call의 바로 다음 번호인 452 로 설정했습니다.
 

5-1. /usr/src/linux-6.5/arch/arm64/include/asm/unistd.h

notion image

5-2. /usr/src/linux-6.5/include/uapi/asm-generic/unistd.h

notion image

5-3. /usr/src/linux-6.5/arch/arm64/include/asm/unistd32.h

notion image

5-4. /usr/src/linux-6.5/kernel/sys_ni.c

notion image

5-5. /usr/src/linux-6.5/include/linux/syscalls.h

notion image

5-6. /usr/src/linux-6.5/arch/microblaze/kernel/syscall_table.S

notion image
 

6. make menuconfig 수행

notion image

6-1. binfmt_misc 지원하기 위해 Kernel support for MISC binaries 활성화

  • 저는 arm64 아키텍처를 사용하므로 이 설정을 활성화 해주었습니다.
  • Executable file formats 항목에 존재
notion image

7. 본격적으로 make 수행

7-1. 아래 명령어로 코어 수 알아두기

grep -c processor /proc/cpuinfo
notion image

7-2. make 순서대로 수행

sudo make -j8 # 코어 수를 뒤에 써주시면 됩니다. sudo make modules_install sudo make install
 
와우!
와우!
 

8. 커널 실행

  • 저는 부팅할 때 커널을 선택할 수 있도록 했습니다.
sudo vim /etc/default/grub # 이렇게 변경 GRUB_TIMEOUT_STYLE=menu GRUB_TIMEOUT=10 # 10초 대기 GRUB_TERMINAL=console # 주석 해제해주기
notion image
notion image
notion image

🙋‍♂️ Trouble Shooting #3

스크린샷은 찍지 못했지만 커널 변경 후 부팅 과정에서 EIF stub: Exiting Boot Servieces 가 뜨며 CPU가 풀로드되지만 재부팅이 되지 않았습니다.

💡 #3 해결 : RAM을 늘려주라 해서 8GB로 늘렸더니 부팅이 되었습니다.

 

9. test.c 생성

간단하게 시스템 콜만 호출하도록 생성했습니다.
notion image

📌 결과 출력

1. uname –r 명령 실행 화면

notion image
notion image

2. 공격 프로세스 실행 중이 아닐 때의 시스템콜 커널 메시지

  • sudo dmesg 명령어를 처음 실행했을 때 나오는 화면입니다.
notion image
  • 맨 밑으로 내리면 메세지를 확인할 수 있습니다. (이전 Clear들은 실험하느라 출력되었습니다.)
notion image
notion image

3. 공격 프로세스 실행 중일 때의 시스템콜 커널 메시지

notion image
notion image

4. 테스트 화면 (공격 프로세스 실행 중)

notion image
notion image
 
 

💡 시행착오

아무래도 ARM64 아키텍처를 사용 중이다보니, 자료도 많지 않기도 했고 Attack_on_POSIX 을 실행하는 부분부터 System call 추가하는 부분까지 힘들었지만 값진 경험이었던 것 같습니다.
 

📚 참고자료

 

댓글

guest