일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 리눅스 커널
- 취약점
- 시스템 프로그래밍
- C언어
- 리눅스커널
- 프로그래밍
- radare2
- Bandit
- Leviathan
- 워게임
- 리버싱
- 시그널
- 드론
- css
- write up
- 어셈블리어
- 시스템해킹
- kernel
- Pwnable.kr
- 시스템프로그래밍
- 컴퓨터구조
- px4
- pwncollege
- 알고리즘
- 커널
- 시스템
- C++
- pwn.college
- wargame
- 리눅스
- Today
- Total
Computer Security
pwn.college : kernel 4.0-4.1 write up 본문
1. vm start 로 vm 환경에서 구동해주자.
2. vm connect 를 통해 연결 해준다.
3.커널의 log 를 출력하는 dmesg 명령어를 사용하면 아래의 welcome to this kernel challenge가 뜬다.
아래의 내용을 살펴보면
[ 2.796630] ### 이 커널 도전에 오신 것을 환영합니다!
[ 2.798121] ###
[ 2.798660] 이 챌린지는 기본 커널 악용에 대해 알려주는 방식으로 커널을 오용합니다.
[ 2.801541] 이 챌린지는 `/proc/pwncollege`를 통해 간단한 문자 장치 인터페이스를 노출합니다.
[ 2.804178] 다른 파일과 마찬가지로 이 장치를 열고 닫을 수 있습니다.
[ 2.806115] 이 장치는 ioctl 인터페이스를 통한 상호 작용도 지원합니다.
[ 2.808211] 이 커널 모듈은 호출 시 호출 프로세스의 권한을 상승시키는 win 함수를 정의합니다.
[ 2.811233] 행운을 빕니다!
/proc/pwncollege를 통해 간단한 문자 장치 인터페이스를 노출한다고 한다.
또한 open,close가 가능하다는 것도 알 수 있다.
이 문제는 전 3.0문제와 다르게 write와 read까지 제한 된 것을 알 수 있다.
4. workspace에 있는 IDA를 이용해서 우리가 받은 challenge kernel 4.0을 열어주자.
5. IDA에서 F5를 누르면 어셈블리어를 C언어코드로 변환 해준다. 변환 한 뒤, device_ioctl부분을 살펴보자.
strncmp함수가 문자열 비교 역할인데 패스워드랑 저 "nyqrdvsyakcmsgfy" 이놈을 비교 한다고 한다.
일단 ioctl을 이용해서 저 패스워드를 넣어줘야 할 듯 하니, ioctl에 대해 알아보자.
ioctl()
시리얼 포트에 통신 데이터를 전송하려면 write()함수를 수신된 통신 데이터를 읽기 위해서는 read()함수를 이용한다.
통신 데이터를 쓰고 읽는 것 이외에 시리얼 통신은 상호간에 통신을 수행하기 위해 전송 속도와 에러 처리 방식을 설정해야 한다.
포트설정에 필요한 제어 데이터를 write()함수나 read()함수의 통신 데이터와 구분짓기 위해서는 별도의 방법이 있어야 한다.
read()함수와 write()함수는 요구된 처리 데이터가 모두 처리되는 것을 보장하지 않는다.
이와 같은 write와 read의 동작 특성은 항상 성공해야 하는 하드웨어의 상태를 설정할 때 문제가 된다.
이런 문제점을 해결하기 위해 리눅스 커널에서 ioctl이라는 방식을 제공한다.
저수준 파일 입출력 함수인 ioctl()을 디바이스 파일에 적용시키면 디바이스 파일에 연결된 디바이스 드라이버의 파일 오퍼레이션 구조체의 ioctl필드에 선언된 함수가 호출된다.
ioctl()함수는 디바이스 파일 이외에는 사용할 수 없는 디바이스 파일 전용 함수이므로 각 디바이스마다 고유하게 선언하여 사용한다.
ioctl()함수의 특징은
- read(), write()함수와 같이 쓰기와 읽기 처리가 가능하다.
- 하드웨어의 제어나 상태를 얻기 위해 사용된다.
- 응용 프로그램의 명령에 따라 디바이스 드라이버의 매개변수 해석이 달라진다
6. ioctl 통신을 위한 스크립트를 작성 해주자.
파일을 O_WRONLY(쓰기전용) 으로 열어주고, 비밀번호를 ioctl을 이용해서 넣어준다.
권한 상승이 된 상태이니, fopen을 이용해서 /flag값을 얻어와주면 되는 코드이다.
7. ioctl.c 를 gcc 컴파일을 해주고, ./a.out 명령어로 실행 해주자.
플래그 값: 0SJq_ciJKapvfIbQE1WMN9UBaOd.QX5IDNsETNwgzW 을 획득 했다!
부가 설명
./a.out
gcc를 이용해 컴파일에 성공하면 a.out이라는 파일이 생성된 것을 확인할 수 있는데 여기서 그냥 명령어로 a.out을 입력하면 명령어를 발견할 수 없다는 오류 메시지가 나온다.
a.out가 저장된 디렉토리를 path로 설정하지 않았기 때문이다.
path로 설정되지 않는 디렉토리에 있는 명령어는 디렉토리 위치를 지정해주지 않는 한 실행되지 않는다.
그러므로 a.out를 실행하려면 다음과 같이 해야 한다.
4.1 또한 똑같은 방식으로 풀어나가면 풀린다!
ps. 저 위의 플래그는 사람마다 다르니 직접 해보자..ㅎ
'pwn.college : kernel' 카테고리의 다른 글
pwn.college : kernel 6.0-6.1 write up (0) | 2022.12.19 |
---|---|
pwn.college : kernel 5.0-5.1 write up (0) | 2022.12.16 |
pwn.college : kernel 3.0-3.1 write up (2) | 2022.12.10 |
pwn.college : kernel 2.0-2.1 write up (2) | 2022.12.07 |
pwn.college : kernel 1.0-1.1 write up (0) | 2022.12.04 |