Computer Security

pwn.college : kernel 5.0-5.1 write up 본문

pwn.college : kernel

pwn.college : kernel 5.0-5.1 write up

쿠리 Kuri 2022. 12. 16. 18:31
반응형

1. vm start 로 vm 환경에서 구동해주자.

 

 

 

 

 

2. vm connect 를 통해 연결 해준다.

 

 

 

 

 

 

3.커널의 log 를 출력하는 dmesg 명령어를 사용하면 아래의 welcome to this kernel challenge가 뜬다.

dmesg

 

 

 

 

아래의 내용을 살펴보면

[ 2.895274] ### 이 커널 도전에 오신 것을 환영합니다!
[ 2.896628] ###
[ 2.897154] 이 챌린지는 기본적인 커널 악용에 대해 알려주는 방식으로 커널을 오용합니다.
[ 2.900074] 이 챌린지는 `/proc/pwncollege`를 통해 간단한 문자 장치 인터페이스를 노출합니다.
[ 2.902642] 다른 파일과 마찬가지로 이 장치를 열고 닫을 수 있습니다.
[ 2.904548] 이 장치는 ioctl 인터페이스를 통한 상호 작용도 지원합니다.
[ 2.906636] 이 커널 모듈은 호출 시 호출 프로세스의 권한을 상승시키는 win 함수를 정의합니다.
[ 2.909622] 문자 장치를 사용하면 커널 내부에서 임의의 함수를 호출할 수 있습니다.
[ 2.912114] 행운을 빕니다!

/proc/pwncollege를 통해 간단한 문자 장치 인터페이스를 노출한다고 한다.

또한 open,close가 가능하다는 것도 알 수 있다.

 

win 함수가 하는 역할이 권한 상승시키는 역할인데, 그렇다면 우리가 win함수를 불러오면 끝이 나는 문제일듯 하다.

 

 

 

 

 

 

 

 


4. workspace에 있는 IDA를 이용해서 우리가 받은 challenge kernel 5.0을 열어주자.

IDA

 

 

 

 

 

 

 

 


5. IDA에서 F5를 누르면 어셈블리어를 C언어코드로 변환 해준다. 변환 한 뒤, device_ioctl부분을 살펴보자.

device_ioctl

일단 4.0 문제와 비슷하게 1337을 넣어주고, arg 주소를 넣어주면 arg함수를 불러온다고 한다.

 

그니까 우리는 arg 자리에 win 주소를 넣어줘야 할 듯 하다.

 

근데 지금 이 문제같은경우 ASLR 이 적용 되어있다.

 

 

 

 

 


ASLR

 

ASLR (Address Space Layout Randomization)이란?

  • 메모리 손상 취약점 공격을 방지하기 위한 기술
  • 스택, 힙, 라이브러리, 등의 주소를 랜덤한 영역에 배치하여, 공격에 필요한 Target address를 예측하기 어렵게 만듦
  • 프로그램이 실행 될 때 마다 각 주소들이 변경됨
  • 예를 들어 Return-To-Libc(RTL) 공격을 하기 위해서는 공유 라이브러리에서 사용하려는 함수의 주소를 알아야 한다.

 

이러한 주소 값들이 프로그램이 호출 될 때 마다 고정적인 주소를 가진다면 매우 쉽게 활용할 수 있다.

 

하지만 ASLR의 적용으로 인해 프로그램이 호출 될 때 마다 스택, 힙, 라이브러리 영역의 주소가 변경되면 공격에 어려워진다. (불가능하지는 않다.)

 

 

위의 ASLR 같은경우는 주소들이 변경되지만, 상대적인 주소는 유지가 된다. 

상대적인 주소를 알면 힌트가 될 수 있겠다.

 

 

 

 

 

 

 

 


6. 일단 win주소를 모르기때문에 arg부분에 아무 주소나 넣어서 실행시켜보자.

ioctl.c

파일을 O_WRONLY(쓰기전용) 으로 열어주고,  아까 IDA로 확인했던 arg 부분에 아무 주소를 한번 넣어준다.

 

 

 

 

 

 

 

 


7. ioctl.c 를 gcc 컴파일을 해주고, ./a.out 명령어로 실행 해주자.

./a.out

 

 

 

 

 


8. 이 뒤에 dmesg를 확인 해보자.

dmesg

 

 

dmesg 부분에서 RIP 부분을 살펴봤더니, 내가 아까 넣은 주소값은 win함수에서 +0xe90 만큼 떨어져있다고 한다!

 

그말은, win 함수의 위치는 아까 임의로 넣었던 주소 0xffffffffc00010bd 에서 - 0xe90를 해주면 된다!

 

 

 

 

 

 

 

 

 


9. 코드 주소부분을 0xffffffffc00010bd 에서 - 0xe90 로 설정해주자.

ioctl.c

 

 

 

 

 

 

 

 

 


10. gcc 컴파일 후, ./a.out으로 실행시켜보자.

./a.out

플래그 값이 정상적으로 나온 것을 확인할 수 있다!

 

 

 

 

 

 

 

 

 

 

5.1 또한 똑같은 방식으로 풀어나가면 풀린다!

 

 

 

 

 

 

ps. 저 위의 플래그는 사람마다 다르니 직접 해보자..ㅎ

반응형
Comments