Ubuntu란
Ubuntu(우분투)는 리눅스 기반의 운영체제 중 하나입니다. 다른 말로 Windows나 macOS처럼 컴퓨터를 동작시키는 OS이죠.
그럼 왜 우분투를 사용할까요? 앞서 언급한 것과 같이 공부하면서 자주 접하게 될 실행파일 포맷은 리눅스에서 실행가능한 elf입니다. 우분투는 리눅스 배포판 중에서 널리 사용되고 입문자에게 친숙한 환경을 제공하기 때문에 가상머신의 OS로 사용합니다.
만약 이제 공부를 시작하신다면 많은 실행 파일의 아키텍처는 x86_64 일 것입니다. 그러니 맥은 ARM 아키텍처를 이용하고 있기에 실행 파일이 실행되지 않습니다. 그렇기에 다른 아키텍처를 가상화하는 에뮬레이션을 통해서 x86_64 계열의 실행파일을 실행할 수 있는 가상머신을 세팅하는 방법을 알려드리도록 하겠습니다.
에뮬레이션에 대한 자세한 내용은 init.tools CORE의 Virtual Environment의 에뮬레이션 부분을 참고해 주시면 될 것 같습니다.
Ubuntu 설치
0. ISO 파일 다운로드
우분투 설치를 위해 우선 ISO파일1을 다운 받아야 합니다. 그리고 에뮬레이션은 성능 저하가 꽤 있기 때문에 서버(CLI) 버전으로 진행하겠습니다. 이번에 사용할 ISO 파일은 ubuntu-24.04.4-live-server-amd64.iso2입니다. (각주의 링크를 통해 바로 다운 가능합니다.)
이제 아래의 가이드를 통해서 설치를 진행해 보겠습니다.
1. 가상 머신 설정
UTM에서 새로운 가상머신 생성을 선택합니다.

아래 이미지의 시작 메뉴의 두 가지 옵션 중에서 에뮬레이션을 선택합니다.
가상환는 호스트기기와 같은 아키텍쳐의 ISO파일을 이용하는 방식이기에 지금은 사용하지 않습니다.

운영체제는 Linux로 선택합니다.

다음으로 에뮬레이션 할 하드웨어는 x86_64가 들어간 머신 중에서 최신 걸로 선택해 보겠습니다.

부팅 이미지 종류는 Boot from ISO image에서 선택하면 됩니다. 경로는 찾아보기...를 눌러 이전에 다운 받은 ISO 파일을 찾아 선택하면 됩니다.

저장소의 크기는 지금은 기본적으로 정해지는 크기로 설정하고 다음 단계로 넘어가겠습니다.
너무 크게 하면 용량이 부족하지 않을까? 하는 의문이 생길 수 있습니다. 하지만 가상머신에서 사용한 용량 만큼만 호스트 기기의 저장공간을 차지합니다. 만약 가상 머신에서 5기가를 사용했으면 호스트 기기에서도 5기가 만큼만 차지합니다.

공유 디렉토리는 원하는 공유 파일이 있는 홀더로 설정하시면 됩니다. 해당 디렉토리를 설정했다고 바로 사용 할 수는 없고, 후에 가상 머신 안에서 추가로 설정을 통해 사용이 가능해집니다.
이번에는 일단 넘어가도록 하겠습니다.

그리고 가상머신의 이름을 자유롭게 원하는 이름으로 정해주면 됩니다. 가상머신 설정 열기는 설정이 끝나고 확인차 설정을 확인하는 창이 나오는 옵션으로 굳이 체크하지 않으셔도 됩니다.

2. Ubuntu 설치
가상 머신의 설정이 끝났으니 이제 본격적으로 우분투 설치를 시작하겠습니다.
우선 이전 단계에서 설정한 가상머신 목록에서 재생처럼 생긴 버튼을 눌러 가상머신을 시작합니다.

가상머신이 시작되면 아래의 이미지와 같은 모습이 보입니다.

잠시 기다리면 아래 이미지와 같이 나오는데, Try or Install Ubuntu Server를 선택하시면 됩니다.
여기서 조작은 다음과 같습니다.
- 이동: 키보드
방향키 - 선택:
리턴 - 취소:
esc

설치가 시작되면 아래의 화면이 나올 때까지 잠시 기다리면 됩니다. 해당 부분은 시스템의 언어를 설정하는 부분입니다. 영어로 선택하고 진행하는 것을 추천드립니다.

언어를 설정하면 최신 버전의 인스톨러(설치 프로그램)가 있는지 확인하고, 만약 최신버전이 있으면 아래 이미지와 같이 인스톨러 업데이트를 진행할 지에 대해 물어봅니다. 인스톨러 업데이트는 개인의 희망에 따라 진행하시면 됩니다.

만약 인스톨러 업데이트를 진행하면 아래 이미지와 같은 화면으로 진행되며, 업데이트가 끝날 때까지 잠시 기다리면 됩니다.

다음으로 키보드 레이아웃 설정인데, 그냥 Done을 선택하고 넘어가면 됩니다.

다음 화면에서도 따로 선택할 필요 없이 Done을 누르시면 됩니다.

이제 중요한 부분입니다. 네트워크 설정과 관련된 부분인데요, 여기에서 DHCPv4라는 부분의 192.168. 으로 되어있는 부분이 보이시나요? 여기에서 /24 앞 부분이 중요합니다. 아래의 이미지 기준에서는 192.168.64.13이 되는 셈이죠.
해당 부분이 우리가 설치한 가상머신의 IP 주로가 되는데, 자동으로 설정되기 때문에 설정됩니다. 이후 이 IP 주소는 원격 접속을 위한 SSH 부분에서 사용되니 잘 기억해 주세요.

다음 부분도 특별히 설정할 필요가 없으니 Done을 선택해 넘어가시면 됩니다.

이 부분은 약간의 기다림이 필요합니다. The mirror location is being tested라는 부분을 유심히 지켜보시다가 해당 부분이 아래 이미지처럼 This mirror location passed tests. 라고 변하면 Done을 선택하시고 다음 단계로 넘어가시면 됩니다.

다음은 저장공간 할당에 관한 부분인데 특별히 세팅할 필요 없이 Done을 선택하여 넘어갑니다.

그러면 이 창이 나오게 되는데 Continue를 선택해서 다음 단계로 넘어가시면 됩니다.

아래 이미지까지 오신거면 설치가 거의 다 된 겁니다.

해당 이미지를 통해서 확인 가능한 빈칸의 사용처는 다음과 같습니다.
Your Name: 사용자 본인의 이름을 적는 공간인데, 굳이 적지 않고 넘어가도 됩니다.Your servers name: 현재 가상머신의 이름을 작성하는 부분입니다.Pick a username: 가상머신 안에서 사용할 본인의 ID입니다.Choose a password: 가상머신 안에서 사용할 PW입니다.Confirm your password: 바로 위에 입력한 것과 동일한 PW를 입력하시면 됩니다. 해당 부분을 입력하면 우분투의 입력창에 반영이 되는데, 위 이미지의 경우 아래와 같이 나오게 될 겁니다.
anon@ubuntu $그럼 위 코드블럭을 참고해서 본인이 원하는 ID와 서버 이름을 설정해 보시길 바랍니다.
아래 이미지는 Ubuntu Pro라는 유료 구독 버전이므로, Skip for now로 넘어가시면 됩니다.

아래 이미지가 이전에 언급했던 IP 주소를 기억해 달라는 부분과 관련이 있는 부분 중 하나입니다. 바로 원격 접속하는 SSH 관련 부분입니다. 여기서 설치를 하지 않고 넘어가면 이후에 따로 설치를 진행해야하기 때문에 Install OpenSSH server를 X표시로 변경하신 뒤 Done을 선택하시면 됩니다.

아래 이미지는 추가적으로 필요한 도구를 설치하는 부분인데, 지금은 넘어가도록 하겠습니다. Done을 눌러주세요

이제 또 잠시 기다림의 시간입니다. 아래 이미지의 주황색 부분의 Installing system이라는 문구가 Installation completet!로 변경될 때 까지 기다림을 가지시면 됩니다.

이제 설치가 완료되면 Reboot Now를 눌러 가상머신 타이틀 바에 있는 전원 버튼을 눌러 종료 해줍니다.
해당 단계에서
Reboot Now를 누르지 않고 바로 종료 해주셔도 됩니다.

이제 UTM을 돌아와서 우리가 설치를 진행한 가상머신 관련 설명의 아랫 부분에 보면 CD/DVD라는 부분이 있는데, 선택해서 초기화 버튼을 눌러주시면 됩니다.
이 부분은 꼭 가상머신이 종료 되어야만 선택이 가능합니다.

CD/DVD 초기화가 끝났으면 다시 재생 버튼처럼 생긴 버튼을 눌러 가상머신을 실행시켜 주시면 아래 이미지 처럼 우분투 설치 때와는 다른 화면이 나오게 됩니다. 이제 설치한 우분투가 부팅되고 있으니 조금만 기다리시면 됩니다.

아래의 이미지와 같은 화면이 나오게 되면 정상적으로 설치가 완료된 것입니다.

이제 우분투 설치 시 입력했던 ID(Pick a username)와 PW(Choose a password)를 입력하시면 로그인이 완료 됩니다.

로그인이 완료 되면 아래 이미지와 같은 화면이 나오게 되는데, 이 단계까지 오면 우분투를 사용할 준비가 끝난 것입니다.

가상머신 SSH 연결
SSH(Secure SHell)란?
SSH는 원격지에 있는 컴퓨터에 네트워크 상으로 접속하기 위한 프로토콜 이라고는 합니다.
이렇게 생각해볼까요? 우리가 친구에게 무언가를 부탁하려고 하는데 바로 옆에 없다면 어떻게 해야할까요?
전화를 한다고 한다면, 우선 전화번호가 있어야겠죠? 이 전화번호를 IP 주소라고 생각하면 됩니다. 그럼 전화번호를 통해서 친구가 전화를 받으면 내가 부탁할 내용을 전달하고 실제로 동작으로 실행시킬 수 있죠.
이런 식으로 원격지에서 내 기기(컴퓨터)에 명령(작업)을 실행할 수 있게 접속하는 방법이라고 생각하면 됩니다.
SSH 연결을 하면 장점이 무엇일까요? 일단 UTM 가상머신으로는 복사/붙여넣기, 마우스 스크롤이 안됩니다. 이러한 단점들을 SSH 연결을 통해서 우리가 사용하는 터미널로 입력이 가능해집니다.
그럼 아래의 단계들을 통해 SSH 연결을 직접 해봅시다.
SSH 연결
기본적으로 SSH를 이용해서 접속하려면 아래의 명령어의 형식으로 입력하시면 됩니다.
ssh anon@192.168.64.13구조를 살펴보면 다음과 같습니다.
ssh 우분투_id@ip_주소여기에 추가적인 옵션을 더 이용하기도 하지만 로컬 가상머신에 접속하는 경우에는 이 정도만으로 충분합니다. id는 우리가 설정한 우분투 서버의 username입니다. IP 주소는 아까 잘 기억해두면 좋다고 한 설정 단계에서의 주소를 입력해주시면 됩니다.
만약 가상머신의 IP 주로를 잊으셨다면,
ip a의 결과에서enp0s1의inet뒤의192.168.로 시작하는 주소를 확인하거나ifconfig의 출력 결과 중enp0s1의inet뒤의192.168.로 시작하는 주소를 확인하시면 됩니다.아래 코드 블럭의 inet 뒤, netmask 앞의 값이 IP 주소입니다. 그러니 여기선
192.168.64.2가 IP 주소가 되는거죠.
# ifconfig 출력 결과 예시
anon@ubuntu:~$ ifconfig
enp0s1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.64.2 netmask 255.255.255.0 broadcast 192.168.64.255
inet6 fe80::2455:12ff:fe7e:920b prefixlen 64 scopeid 0x20<link>
inet6 fde0:a67e:8a80:e80:2455:12ff:fe7e:920b prefixlen 64 scopeid 0x0<global>
ether 26:55:12:7e:92:0b txqueuelen 1000 (Ethernet)
RX packets 676 bytes 192489 (192.4 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 347 bytes 40861 (40.8 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 100 bytes 7872 (7.8 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 100 bytes 7872 (7.8 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0그럼 SSH 연결을 시도해 볼까요? 아래의 단계들을 따라와 주시면 됩니다.
우선 이전 가상머신의 설치 시 할당받은 IP 주소와 달라진 이유는 가상머신을 다른 기기로 옮겨서 새로운 IP 주소가 할당되었기 때문입니다.
192.168.64.13→192.168.64.2
위에 명시한 명령어 처럼 해당하는 본인의 ID와 IP 주소에 맞게 입력합니다.

만약 처음 iTerm에서 SSH를 사용한다면 아래와 같은 경고창이 나올 수 있습니다.

허용 버튼을 눌러 접속이 가능하게 해줍니다. 만약 처음 접속하는 IP 주소의 경우 fingerprint를 호스트 기기에 등록할건지 아래와 같이 물어봅니다. yes를 입력하면 다음 단계로 진행할 수 있습니다.

그럼 비밀번호를 입력하는 부분이 나오게 됩니다. 본인의 ID에 맞는 비밀번호 (우분투 로그인 할 때 사용했던 그 비밀번호)를 입력하면 됩니다.

정상적으로 로그인이 완료되면 아래 이미지와 같은 내용이 터미널에 출려됩니다.

위 이미지처럼 본인의 ID@서버 이름의 형태의 터미널이 표시되면 SSH 연결에 성공한 것입니다!
UTM으로 실행한 가상머신에서는 보지 못한 색상들이 표현 되기 시작하고, 자유롭게 복사 붙여넣기가 가능해졌습니다!
VSCode SSH 연결
iTerm을 이용하는 방법 말고도 VSCode를 이용해서 가상머신에 SSH 연결을 진행하는 방법도 존재합니다.
SSH 연결을 위해서는 우선 VSCode 좌하단의 >,<가 겹쳐진 듯한 모양(하단 이미지의 Open a Remote Window 말풍선 위치)을 클릭합니다.

그럼 상단에 위와 같은 메뉴가 나오게 되는데, SSH 또는 Connect to Host를 선택하면 됩니다.

SSH 또는 Connect to Host를 선택하면 아래와 같은 이미지가 나오게 되는데, 해당 창에 터미널에서 SSH 연결을 시도하듯 입력하시면 됩니다. 단, ssh 명령어는 없다는 차이점이 있죠.
만약 VSCode를 설치하고 처음으로 원격 연결을 시도한다면 아래 이미지와 같은 경고창이 나올 수 있으나,
허용을 누르고 진행하시면 됩니다.
잠시 기다리면 비밀번호를 입력하는 창이 나오게 됩니다. 여기에 본인 계정의 우분투 비밀번호를 입력하시면 됩니다.

그러면 아래 이미지처럼 연결을 시도합니다.

정상적으로 로그인이 진행되면 SSH: 192.168.64.2처럼 연결된 SSH가 어떤 IP 주소에 연결이 되었는지 알 수 있습니다.

그럼 이제 VSCode에서 가상머신에 연결이 성공적으로 진행되었습니다.
SSH 연결이 되면 연결된 가상머신 내부의 폴더도 직접 코드 에디터 내부에서 열 수 있습니다. 아래 이미지와 같이 VSCode 아이콘 아래 버튼을 눌러 진행할 수도 있고, 위에서 알려드린 방식으로 하셔도 무방합니다.

또한 VSCode에서 터미널을 열었을 때 가상머신의 터미널로 연결됩니다. 이 부분은 이전에 설명드린 것처럼 VSCode 쪽에서 방식 그대로 터미널에 접근하시면 됩니다.

우분투 환경 세팅 및 도구 설치
이제 SSH 연결도 성공했으니 본격적으로 우분투 환경 세팅을 진행해 보겠습니다.3아래 내용은 사용자 본인이 편한 방식을 이용해 SSH 접속 후 진행하는 것을 추천드립니다.
패키지 업데이트
우선 아래의 명령어를 입력하여 도구 다운로드의 준비를 해줍니다.
sudo apt update && sudo apt upgrade -y
아래 이미지처럼 비밀번호 입력을 요구하면 본인의 계정의 비밀번호를 입력하시면 됩니다.

잠시 업데이트가 끝날때까지 기다리면 됩니다.

중간에 아래와 같은 화면이 나올 때도 있는데, 당황하지 말고 리턴을 눌러 넘어가시면 됩니다.

아래와 같이 에러가 없이 업데이트가 끝이나면 정상적으로 업데이트가 완료 된 것입니다.

패키지 설치
이제 필요한 패키지들을 설치해 볼까요? 아래의 명령어를 입력하면 됩니다.
sudo apt install nano gcc gdb net-tools binutils python3 python3-pip python3-venv
아래의 이미지처럼 비밀번호를 요구하는 부분이 나오면 이전처럼 본인의 비밀번호를 입력하시면 됩니다.

아래의 이미지에서는 Do you want to continue? [Y/N] 부분이 있는데, y를 입력하여 다음 단계로 넘어가시면 됩니다.
이번에 사용한 명령어에도
-y옵션을 추가하면 이 부분을 스킵할 수 있습니다.

이제 설치가 완료 될 때까지 기다리면 됩니다.

아래와 같은 화면이 나오면? 리턴을 눌러 넘어가시면 됩니다.

설치가 끝나고 아래 이미지와 같이 에러가 없으면 정상적으로 설치가 완료된 것입니다.
apt install은 루트(관리자) 권한이 있어야 설치가 진행되기 때문에 명령어 앞에 sudo를 붙였습니다. 이 명령어로 설치가 끝나면 기본적인 환경 구축은 끝났다고 보셔도 됩니다.
설치한 패키지 설명
이번에 설치한 패키지들에 대해 간략하게 설명하면 아래와 같습니다.
nano:
- 터미널에서 사용할 수 있는 텍스트 편집기입니다. 메모장의 터미널 버전이라고 생각하시면 됩니다.
- 설정 파일을 수정하거나 간단한 코드를 작성할 때 유용합니다.
gcc:
- C언어로 작성한 코드를 컴퓨터가 실행할 수 있는 프로그램으로 변환해주는 도구(컴파일러)입니다.
- C언어를 이용한 문제를 풀거나 프로그램을 만들 때 필요합니다.
gdb:
- 프로그램이 어떻게 동작하는지 한 줄 한 줄 따라가며 분석할 수 있는 디버거입니다.
- 프로그램의 오류를 찾거나, 보안 분야에서 바이너리를 분석할 때 자주 사용됩니다.
net-tools:
- 네트워크 상태를 확인할 수 있는 명령어 모음입니다.
ifconfig같은 명령어가 여기에 포함됩니다. - 내 IP 주소를 확인하거나 네트워크 연결 상태를 점검할 때 사용합니다.
binutils:
- 컴파일된 프로그램(바이너리 파일)을 분석하거나 조작할 수 있는 도구 모음입니다.
- 보안 공부를 하다 보면 프로그램 내부 구조를 들여다볼 일이 많은데, 그때 필요한 도구들이 들어있습니다.
python3:
- 파이썬 프로그래밍 언어 본체입니다. 보안 도구 제작, 문제 풀이 등 거의 모든 곳에서 사용됩니다.
python3-pip:
- 파이썬용 패키지 관리자입니다. 다른 사람이 만들어 놓은 파이썬 라이브러리를 설치할 때 사용합니다.
apt가 리눅스 프로그램의 앱스토어라면,pip은 파이썬 라이브러리의 앱스토어라고 생각하면 됩니다.
python3-venv:
- 파이썬 가상환경을 만들 수 있게 해주는 도구입니다.
- 프로젝트마다 서로 다른 버전의 라이브러리를 사용해야 할 때, 각각 독립된 공간을 만들어서 충돌을 방지해 줍니다.
이전: 6. 가상환경
목차: 0. 따라만 하면 완성!! 해커 노트북 세팅 - MacOS편
다음: 8. 호스트 기기에 설치하는 분석 도구들
Footnotes
-
운영체제를 설치하는데 필요한 모든 데이터를 파일로 만든 형태라고 생각하면 됩니다. ↩
-
Ubuntu 24.04 server amd64 https://ubuntu.com/download/server/thank-you?version=24.04.4&architecture=amd64<s=true ↩
-
명령어 몇개만 더 입력하는 수준입니다. ↩
