System call을 이용해 커널모드로 전환되었을 때 root권한으로 상승시켜야 하는 문제이다.
커널 exploit을 맛볼 수 있는 기회가 되었다.
(문제화면)
커널 exploit에서는 시원하게 uid를 0으로 만들어버리는 방법을 사용한다. 그 후 shell을 실행시키면 root권한의 쉘을 얻을 수 있는 것이다.
(시스템 확인)
(커널모듈)
커널 모듈 소스코드를 문제에서 주었다.
(커널 모듈 소스코드)
(dmesg 확인)
위에서 정의한 system_call은 입력포인터, 출력포인터에 대한 범위 검사가 없다. 그렇기에 원하는 곳에 원하는 값을 적을 수 있다는 이야기이다.
시스템콜이 동작할 때는 커널모드로 전환되므로 메모리에서 커널영역 또한 참조하고 수정할 수 있다. 위 시스템콜의 취약점을 이용하면 커널영역을 마음대로 수정할 수 있다는 이야기가 된다.
나는 system call table의 주소를 내가 원하는 함수로 덮어 쓰므로써 원하는 함수를 실행하기로 계획했다.
커널 exploit 할 때는 uid를 0으로 만들어버린다고 했었는데 방법은 이렇다.
commit_creds(prepare_kernel_cred (0));
위 주소는 cat /proc/kallsyms | grep @@ 을 통해 찾을 수 있다.
그 후 table의 원하는 주소를 찾아 그 주소를 위 함수가 실행될 수 있도록 덮어쓰고 실행하면 된다.
나는 getuid와 geteuid를 덮어썼다.
(내 exploit코드)
여기서 주의할 점은 영어 소문자의 범위가 되면 -0x20이 된다는 점이다. 그렇기에 60까지 쓸 수 있는데 그러면 geteuid를 실행하게 되면 0x8003f560으로 넘어 가게 될텐데, 6c 까지 슬라이딩해서 넘어가야한다. nop으로 깔아주려 했으나 arm 계열에서 nop의 코드는 0x00이다.
(nop 코드)
(mov r1, r1)
이 코드를 컴파일 한 후 실행해보면
(권한상승)
권한이 상승된 것을 확인할 수 있고 flag까지 안전하게 확인할 수 있었다.
'WarGame > 500 Project' 카테고리의 다른 글
(65/500) pwnable.kr - echo2 (0) | 2018.03.08 |
---|---|
(64/500) backdoor - Enter the matrix (0) | 2017.10.31 |
(62/500) NOE.systems - BURYBURY (0) | 2017.10.01 |
(61/500) NOE.systems - double_input (0) | 2017.09.17 |
(60/500) pwnable.kr - crypto1 (0) | 2017.08.27 |