본문 바로가기

computer system

ubuntu 22 - 맥북 M1 ARM64에서 32비트 어셈블리어로 분석하는 법

학교 과제로 시스템해킹 실습을 해야하는데, 맥북이라서 문제가 많았다...

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