Studying Security

SigReturn Oriented Programming (SROP) 본문

개념 정리

SigReturn Oriented Programming (SROP)

J4guar 2022. 4. 14. 06:08
728x90
반응형

Signal이란?

  • 프로세스에게 이벤트가 발생했음을 알리는 역할을 한다.
  • signal이 발생하면 signal에 해당하는 코드가 Kernel mode에서 실행되고 다시 유저 모드로 복귀한다.
  • signal은 일반적으로 커널이 송신하며, 다음과 같은 이벤트 종류가 있습니다.
    • 하드웨어 예외가 발생한 경우
    • 사용자가 시그널을 발생시키는 터미널 특수 문자 중 하나를 입력한 경우
      • Interrupt character(Control + c)
      • Suspend character(Control + z)
    • 소프트웨어 이벤트가 발생한 경우
      • 파일 디스크립터에 입력이 발생
      • 타이머 만료
      • 해당 프로세스의 자식 프로세스가 종료
  • signal은 생성되면 프로세스에 전달되고, 전달된 시그널의 종류에 따라 다음과 같은 동작이 실행됩니다.
    • 시그널 무시합니다.
    • 프로세스 종료합니다.
    • 코어 덤프 파일을 생성 후 프로세스 종료합니다.
    • 프로세스 중지합니다.
    • 프로세스의 실행을 재개합니다.

Signal의 종류

"/usr/include/asm/signal.h"

kill -l 명령어

Signal handler

  • signal handler는 프로그램이 특정 시그널의 기본 동작을 수행하는 대신 프로그래머가 원하는 동작을 수행하도록 변경할 수 있습니다.
  • signal handler는 User Mode 프로세스에 정의되어 있고 User Mode 코드 세그먼트에 포함됩니다.
  • signal handler가 User Mode 에서 실행되는 동안 Kernel Mode에서 handle_signal() 함수가 실행 됩니다.
    • User Mode에서 Kernel Mode로 진입시 User Mode에서 사용중이던 context를 Kernel stack에 저장합니다.
    • Kernel Mode에서 User Mode로 진입시 Kernel stack은 모두 초기화됩니다.
    • 이러한 문제를 해결하기 위해 setup_frame(), sigreturn() 함수를 사용합니다.
      • setup_frame() : User Mode의 stack을 설정
      • sigreturn() : Kernel Mode stack에 hardware context를 복사하고, User Mode stack의 원래의 content를 저장한다.
  • Signal handler는 다음과 같이 처리됩니다.
    • 인터럽트 또는 예외가 발생하면 프로세스는 Kernel Mode로 전환됩니다. 
    • 커널은 User Mode로 돌아 가기 전에 do_signal() 함수를 실행합니다.
      • do_signal() 함수는 handle_signal()을 호출하여 signal를 처리합니다.
      • handle_signal() 함수는 setup_frame()을 호출하여 User Mode Stack에 context를 저장합니다.
    • 프로세스가 User Mode로 다시 전환되면 signal handler가 실행됩니다.
    • signal handler가 종료되면 setup_frame() 함수에 의해 User Mode stack에 저장된 리턴 코드가 실행됩니다.
      • 해당 코드에 의해 sigreturn() 시스템 함수가 호출됩니다.
        • sigreturn() 시스템 함수에 의해 Kernel Mode Stack에서 일반 프로그램의 hardware context를 User Mode의 stack에 복사합니다.
        • sigreturn() 함수는 restore_sigcontext() 을 호출하여 User Mode 스택을 원래 상태로 복원합니다 
    • 시스템 호출이 종료되면 일반 프로그램은 실행을 재개 할 수 있습니다.

정리

SROP

context switching을 위해 사용하는 sigreturn 시스템 콜을 이용해 레지스터에 원하는 값을 저장하는 기법

이를 이용해 원하는 시스템 함수를 호출할 수 있음

Exploit method

1. sigreturn 함수를 이용해 레지스터에 필요한 값 저장

  • RSP : sigreturn() 함수 호출 후 이동할 주소
  • RIP : "int 0x80" 명령어가 저장된 주소

레지스터를 sigcontext 구조체에 정의된 레지스터 순서를 고려하여 스택에 값을 써넣어야 함

pwntools의 SigreturnFrame 클래스를 이용하면 시간을 절약할 수 있음

2. int 0x80 명령어 실행

Reference

 

07.SROP(Sigreturn-oriented programming) - TechNote - Lazenca.0x0

페이지 … TechNote 02.TechNote 05.Basic exploitation techniques Skip to end of banner Go to start of banner 07.SROP(Sigreturn-oriented programming) Skip to end of metadata 작성자 : Lazenca.0x0 - 5월 27, 2018 Go to start of metadata

www.lazenca.net

 

반응형

'개념 정리' 카테고리의 다른 글

Master Canary  (0) 2022.05.18
__environ  (0) 2022.05.11
_rtld_global  (0) 2022.04.28
Return to Shellcode  (0) 2022.04.13
Return to Libc (RTL)  (0) 2022.04.09
Comments