일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- srop
- tcache
- DFB
- 나뭇잎 책
- Dynamic Analysis
- Android
- DreamHack
- RTL
- malware
- ROP
- Lazenca
- UAF
- _IO_FILE Arbitrary Address Read
- shellcode
- Reversing
- vtable
- K-shield Junior
- H4CKING GAME
- HackCTF
- GOT overwrite
- DFC 2022
- _IO_FILE
- heap exploit
- BOF
- master canary
- seccomp
- heap feng shui
- _IO_FILE Arbitrary Address Write
- heap
- __environ
Archives
- Today
- Total
Studying Security
SigReturn Oriented Programming (SROP) 본문
728x90
반응형
Signal이란?
- 프로세스에게 이벤트가 발생했음을 알리는 역할을 한다.
- signal이 발생하면 signal에 해당하는 코드가 Kernel mode에서 실행되고 다시 유저 모드로 복귀한다.
- signal은 일반적으로 커널이 송신하며, 다음과 같은 이벤트 종류가 있습니다.
- 하드웨어 예외가 발생한 경우
- 사용자가 시그널을 발생시키는 터미널 특수 문자 중 하나를 입력한 경우
- Interrupt character(Control + c)
- Suspend character(Control + z)
- 소프트웨어 이벤트가 발생한 경우
- 파일 디스크립터에 입력이 발생
- 타이머 만료
- 해당 프로세스의 자식 프로세스가 종료
- signal은 생성되면 프로세스에 전달되고, 전달된 시그널의 종류에 따라 다음과 같은 동작이 실행됩니다.
- 시그널 무시합니다.
- 프로세스 종료합니다.
- 코어 덤프 파일을 생성 후 프로세스 종료합니다.
- 프로세스 중지합니다.
- 프로세스의 실행을 재개합니다.
Signal의 종류
"/usr/include/asm/signal.h"
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 스택을 원래 상태로 복원합니다
- 해당 코드에 의해 sigreturn() 시스템 함수가 호출됩니다.
- 시스템 호출이 종료되면 일반 프로그램은 실행을 재개 할 수 있습니다.
정리
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