SROP(Sigreturn-oriented programming)
- SROP는 sigreturn 시스템 콜을 이용하여 레지스터에 원하는 값을 저장할 수 있다.
- 해당 기법을 이용하여 원하는 시스템 함수를 호출할 수 있다.
Signal & Signal handler
Example code
- 다음과 같이 handle_signal 함수에 Break point를 설정한다.
- 그리고 GDB가 인트럽트에 반응하지 않도록 설정한다.
다음과 같이 프로그램을 실행 후 "Ctrl + C"를 눌러서 Interrupt 신호를 발생시킨다.
- bt명령어를 이용해 handle_signal 함수가 호출되기 전에 실행된 함수 목록을 확인 할 수 있다.
Frame 0
다음과 같이 0번째 Frame에서 Stack에 저장된 각 각의 레지스터 값을 확인 할 수 있다.
Frame 1
다음과 같이 1번째 Frame의 내용을 보면 __restore_rt() 함수에서 rt_sigreturn() 시스템 함수를 호출한다.
- x64에서 sigreturn 시스템 함수의 번호는 0xf(15) 이다.
Frame 2
다음과 같이 signal에 대한 처리가 끝난 후에 Frame 0의 Stack에 저장된 값이 레지스터에 저장된 것을 확인 할 수 있다.
sigreturn()
- sigreturn() 시스템 함수는 Signal을 처리하는 프로세스가 Kernel Mode에서 User Mode 돌아 올때 stack을 복원하기 위해 사용되는 함수 이다.
- sigreturn() 함수는 stack을 복원하기 위해 restore_sigcontext()를 호출한다.
- restore_sigcontext() 함수는 COPY_SEG(), COPY() 함수 등 을 이용하여 stack에 저장된 값을 각 레지스터에 복사한다.
- 즉, ROP와 같이 값을 레지스터에 저장할 수 있는 Gadget이 없어도 sigreturn() 함수를 이용해 각 레지스터에 원하는 값을 저장할 수 있다.
- x64의 경우 stack에 저장된 레지스터 값들은 restore_sigcontext()함수의 인자값 &frame->uc.uc_mcontext에 의해 전달된다.
Proof of concept
다음과 같이 Overflow를 확인할 수 있다.
Exploit 순서
-
sigreturn()함수를 이용해 레지스터에 필요한 값을 저장
- RSP : sigreturn() 함수 호출 후 이동할 주소("int 0x80" 명령어가 저장된 주소)
- RDI : "/bin/sh" 문자열이 저장된 주소
- RAX : execve() 함수의 시스템 콜 번호
- RIP : "int 0x80" 명령어가 저장된 주소
- CS : User Code(0x33)
- SS : User Data / Stack(0x2b)
- int 0x80 명령어 실행
확인해야 할 정보 목록
- Libc offset
- printf
- "pop rax; ret"
- "syscall"
-
"/bin/sh"명령가 저장된 영역
-
Gadgets
Libc offset
Find Gadgets
다음과 같이 libc 파일에서 필요한 가젯을 찾을 수 있다.
- 해당 Exploit code에서 사용할 "pop rax ; ret" Gadget의 주소는 0x33544 이다.
- 해당 Exploit code에서 사용할 "syscall ; ret" Gadget의 주소는 0xbc375 이다.
Find Gadgets - (syscall & return)
빌드된 x64 파일의 리눅스 커널 버전이 3.3 이하일 경우 아래와 같이 vsyscall 영역에서 "syscall & return" 명령어를 찾을 수 있다.
하지만 해당 Gadget을 이용하여 시스템 함수를 호출하면 Error가 발생한다.
- 이는 Kernel의 Boot option중 "vsyscall"의 값이 "emulate"으로 설정되어 있기 때문이다.
- 해당 옵션이 Native 로 설정되어 있다면 사용가능하다.
CS(Code segment) & SS(Stack Segment)
- x64의 경우 Kernel Code, User Code의 값이 x86과 다르다.
Segment
purpose |
segment |
Kernel Code |
0x10 |
Kernel Data/Stack |
0x18 |
User Code |
0x33 |
User Data/Stack |
0x2b |
exploit
use pwntools
RET : https://www.lazenca.net/display/TEC/02.SROP%28Sigreturn-oriented+programming%29+-+x64
댓글 영역