-
vsyscall을 이용한 Exploit공부정리 2019. 6. 16. 01:55
리눅스 ELF 바이너리에는 고정적인 주소를 가진 vsyscall영역이 있다.
[ vsyscall ]
해당 영역은 ASLR, PIE와 같은 주소랜덤화 기법이 적용되어 있어도 항상 고정적인 주소를 갖는다.
또한, 실행권한(x)이 부여되어 있어 필요한 가젯을 가져와서 사용할 수 있다.
[ vsyscall ]
vsyscall영역은 syscall의 Overhead를 줄이기 위해 User Space에 할당된 커널 영역이다.
syscall을 사용하면 User mode에서 Kernel mode로 Context Switching이 발생하게 된다.
User의 Context는 따로 저장해두고 Kernel의 Context를 불러오고,
Kernel에서 모든 작업이 종료되면, 저장해뒀던 User Context를 불러오는 작업을 하게된다.
매번 시스템콜이 발생할 때 마다 이런 작업을 하다보니 Overhead가 커지게 됐고,
이런 문제를 보완하기 위해 간단한 시스템콜은 User mode에서 처리하도록 vsyscall영역을 할당한 것이다.
하지만, 모든 프로세스의 고정적인 주소가 할당되는 특징은 보안적인 문제로 이어졌고,
이런 부분을 해결하기 위해 vDSO(virtual Dynamic Shared Object)영역이 vsyscall의 역할을 대신하게 된다.
[ How to Exploit? ]
vsyscall영역은 특정 시스템콜만 처리하는 루틴만 있기 때문에 가젯이 다양하지는 않다.
우리가 Exploit을 할 때 사용할 수 있는 가젯은 [ret]가젯 밖에 없다.
[0x...600000](mov ~)이 아닌 [0x...600007]이나 [0x...600009]를 바로 실행하면 Kernel에서 잡아내기 때문에
무조건 0x...600000(mov ~)를 실행하는 형태로 가젯을 이용해야 한다.
따라서, syscall가젯은 CallNumber가 바뀌기 때문에 사용하지 못하고 마지막의 RET가젯만 사용할 수 있다.
'공부정리' 카테고리의 다른 글
패턴 검사하는 문제 풀 때 (0) 2019.06.18 checksec없이 NXbit 확인하기 (1) 2019.06.17 gdb로 fork된 자식프로세스 디버깅하기 (2) 2019.04.06 Syscall 가젯이 없을 때 (0) 2019.03.06 Return-to-Csu 기법 정리 (8) 2019.03.05 댓글