📎 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 설치
2. SSH 설정 진행
sudo apt update sudo apt install build-essential vim openssh-server net-tools
sudo systemctl enable ssh sudo systemctl start ssh
sudo vi /etc/ssh/sshd_config
3. 권한 부여
sudo chown -R {유저네임} .
4. 필수 패키지 설치
sudo apt install build-essential libncurses5 libncurses5-dev bin86 libssl-dev bison flex libelf-dev
5. 프로그램 실행 되는지 확인
# ssh 환경에서 실행되지 않는다면 이렇게 하면 됩니다. sudo chown -R {사용자 이름} .
🙋♂️ Trouble Shooting #1
bash: ./Attack_on_POSIX: cannot execute binary file: Exec format error
arm64 환경이라 x86-64 환경의 프로그램이 실행되지 않았습니다.
💡 #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
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
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
📌 문제 해결 과정 (수행 과정)
1. Makefile에 이름 추가 (조건 1: 커널 명에 자신 이름 포함)
Makefile
에서EXTRAVERSION
이름 변경
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=""
3. Attack_on_POSIX
을 죽일 시스템 콜 선언
/usr/src/linux-6.5/kernel
시스템 콜을 컴파일하기 쉽도록 kernel
폴더에 코드 파일을 넣었습니다.
SYSCALL_DEFINE0
을 사용해 인자를 받지 않는 시스템 콜을 정의했습니다.
- 또한 과제에서 제시된
for_each_process
와get_task_comm
함수를 사용했습니다.
#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
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
5-2. /usr/src/linux-6.5/include/uapi/asm-generic/unistd.h
5-3. /usr/src/linux-6.5/arch/arm64/include/asm/unistd32.h
5-4. /usr/src/linux-6.5/kernel/sys_ni.c
5-5. /usr/src/linux-6.5/include/linux/syscalls.h
5-6. /usr/src/linux-6.5/arch/microblaze/kernel/syscall_table.S
6. make menuconfig
수행
6-1. binfmt_misc
지원하기 위해 Kernel support for MISC binaries
활성화
- 저는 arm64 아키텍처를 사용하므로 이 설정을 활성화 해주었습니다.
Executable file formats
항목에 존재
7. 본격적으로 make
수행
7-1. 아래 명령어로 코어 수 알아두기
grep -c processor /proc/cpuinfo
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 # 주석 해제해주기
🙋♂️ Trouble Shooting #3
스크린샷은 찍지 못했지만 커널 변경 후 부팅 과정에서
EIF stub: Exiting Boot Servieces
가 뜨며 CPU가 풀로드되지만 재부팅이 되지 않았습니다.💡 #3 해결 : RAM을 늘려주라 해서 8GB로 늘렸더니 부팅이 되었습니다.
9. test.c
생성
간단하게 시스템 콜만 호출하도록 생성했습니다.
📌 결과 출력
1. uname –r
명령 실행 화면
2. 공격 프로세스 실행 중이 아닐 때의 시스템콜 커널 메시지
sudo dmesg
명령어를 처음 실행했을 때 나오는 화면입니다.
- 맨 밑으로 내리면 메세지를 확인할 수 있습니다. (이전 Clear들은 실험하느라 출력되었습니다.)
3. 공격 프로세스 실행 중일 때의 시스템콜 커널 메시지
4. 테스트 화면 (공격 프로세스 실행 중)
💡 시행착오
아무래도 ARM64 아키텍처를 사용 중이다보니, 자료도 많지 않기도 했고
Attack_on_POSIX
을 실행하는 부분부터 System call
추가하는 부분까지 힘들었지만 값진 경험이었던 것 같습니다.
댓글