학교 과제로 시스템해킹 실습을 해야하는데, 맥북이라서 문제가 많았다...
1. ARM64 M1칩은 비교적 최신 우분투만 지원한다는 것 (학교에서 제공해주는 구버전이 CPU호환 문제로 설치가 되지 않는다..)
2. 최신 우분투에는 보호기법이 많다는 것
모든 과제가 윈도우 기준으로 제공되어서 맥북에 맞추어 커스텀하여 진행했다. 이 글을 읽는 맥 유저들이 학교 과제를 수월히 진행 할 수 있길 바란다.
맥북에서 32비트 어셈블리어로 보려면 다음이 필요하다.
1. 우분투 - 설치되어있다고 가정
2. 크로스 컴파일러 - i686-linux-gnu-gcc
3. 파일 실행 - qemu-i386 / qemu-system-i386
4. gdb-multiarch
1. 크로스 컴파일러 설치하기
sudo apt install gcc-i686-linux-gnu
컴파일시 다음과 같은 옵션을 넣어 진행한다
2. 애뮬레이터 설치하기
크로스 컴파일을 하면 32비트 인텔 기준으로 파일이 떨궈진다. 이를 arm64에서는 실행할 수 없기 때문에 qemu-i386을 이용해 실행한다.
사용자 모드 qemu-i386
sudo apt install qemu qemu-user qemu-user-static
시스템 모드 qemu-system-i386
이걸 이용하면 32비트 시스템 위에서 실행할 수 있기 때문에 크로스 컴파일러나 멀티 디버거가 전부 필요없다.
qemu-img create -f qcow2 my_disk.img 10G -> iso를 돌릴 공간 마련 10G
qemu-system-i386 -m 1024 -cdrom ubuntu-16.04.6-server-i386.iso -hda my_disk.img -boot d
사용자 모드에서는 qemu-i386의 한계로 권한 상승(ex. setUID) 등이 제대로 이루어지지 않는다. 이러한 경우 시스템 모드를 사용해 직접 32비트 인텔 운영체제를 돌려 사용해야한다. 나는 ubuntu-16.04.6-server-i386.iso 이미지를 올려 간단한 디버깅과 실행을 진행했다. my_disk.img는 임의의 이름으로 변경하여 사용하여도 된다.
3. 디버거 설치하기
sudo apt install gdb-multiarch
크로스 컴파일러를 통해 32 비트 인텔 기반 파일을 만들었기 때문에, 디버깅 하려면 gdb-multiarch를 이용해야한다.
분석하기 : qemu-i386 이용
1. 컴파일하기
컴파일시 다음 옵션을 넣어 진행한다.
i686-linux-gnu-gcc -m32 -static -fno-stack-protector -mpreferred-stack-boundary=2 -fno-asynchronous-unwind-tables -fno-omit-frame-pointer -no-pie -fno-pic -fno-pie -fcf-protection=none -O0 -g -o {실행 파일 명} {파일명}
위의 옵션을 넣어 생성된 실행파일을 디버로 읽으면 어셈블리어가 예쁘게 출력된다. 본인의 상황에 따라 불필요한 옵션들을 제거하여 사용하면 된다.
2. 실행하기
qemu-i386 ./{실행 파일 명}
qemu-i386 -g 1234 ./{실행 파일 명}
-g 는 디버거를 사용하는 경우만 붙이면 된다. -g 뒤에는 포트 번호이며, 아무 숫자나 넣어주면 된다.
3. 디버깅
gdb-multiarch ./{실행 파일 명}
target remote localhost:1234
이후 gdb-multiarch를 이용해 해당 파일 디버깅을 시작한다. 포트번호는 본인이 설정한 포트를 입력한다.
ret 주소 등을 직접 구해서 사용하는 것이 아니면 사용자 모드로 웬만한 exploit은 가능하다.
분석하기: qemu-system-i386 이용
qemu-system-i386 -m 2048(메모리로 값 변경가능) -hda my_disk.img -net user,hostfwd=tcp::2222-:22 -net nic
만약 시스템모드를 이용하는경우 위의 명령어를 사용하여 실행시키면된다. tcp::2222-:22의 경우, 호스트의 파일을 열거나 ssh로 붙는경우 유용하기 때문에 사용하는 것이 좋다. 물론 서버에 oepnssh-server를 설치해야한다.
사용해본 결과 터미널을 하나밖에 사용하지 못하고, 터미널 입력이나 출력이 제대로 되지않는 경우가 있어 ssh로 붙어서 호스트 터미널을 이용하는 것이 좋다
다음은 ssh와 호스트 파일을 올리는 명령어다.
ssh -p 2222 username@localhost
scp /path/to/your/file user@localhost:/path/on/guest
'computer system' 카테고리의 다른 글
Tour of Computer System (3) | 2023.12.03 |
---|