• 카테고리

    질문 & 답변
  • 세부 분야

    보안

  • 해결 여부

    해결됨

swapgs_restore_regs_and_return_to_usermode

22.08.09 00:41 작성 조회수 325

0

안녕하세요. 

페이지 테이블을 분리해주는 역할을 하는 swapgs_restore_regs_and_return_to_usermode함수를 사용하는 것이 왜 KPTI를 우회할 수 있게 해주는 것인지 궁금합니다. 

답변 1

답변을 작성해보세요.

1

안녕하세요.

swapgs_restore_regs_and_return_to_usermode 는 강의에 나온 대로, 커널 모드에서 유저 모드로 전환할 때 호출되는 함수입니다.

KPTI가 설정될 경우 커널 공간과 유저 공간이 서로 다른 페이지 테이블을 사용하게 되는데, 이 swapgs_restore_regs_and_return_to_usermode 함수에서는 cr3 레지스터의 값을 커널의 페이지 테이블에서 유저의 페이지 테이블로 전환시켜주는 역할을 하기 때문에 KPTI 우회에 사용되는 것입니다.

 

다시 말해,

1. KPTI는 커널과 유저가 서로 다른 페이지 테이블을 사용하도록 합니다. 그렇기 때문에 모드 간 전환시 cr3에 저장된 페이지 테이블 주소를 변환시켜주어야 합니다.

2. cr3 변환 작업을 하는 함수가 바로 swapgs_restore_regs_and_return_to_usermode 함수입니다. 이 함수는 KPTI의 설정 여부에 상관없이 호출됩니다(KPTI 설정 여부에 따라 함수의 흐름이 달라짐).

3. exploit이 완료되고 유저 모드로 복귀할 때 cr3를 유저 모드의 페이지 테이블 주소로 변경해주지 않으면, 당연히 커널 패닉이 발생하기 때문에 ROP chain의 마지막에 swapgs_restore_regs_and_return_to_usermode 함수가 사용됩니다.

 

김성수님의 프로필

김성수

질문자

2022.08.10

답변 감사합니다!