상세 컨텐츠

본문 제목

02.SROP(Sigreturn-oriented programming) - x64

본문

SROP(Sigreturn-oriented programming)

  • SROP는 sigreturn 시스템 콜을 이용하여 레지스터에 원하는 값을 저장할 수 있다.
    • 해당 기법을 이용하여 원하는 시스템 함수를 호출할 수 있다.

Signal & Signal handler

 

01.SROP(Sigreturn-oriented programming) - x86

SROP(Sigreturn-oriented programming) SROP는 sigreturn 시스템 콜을 이용하여 레지스터에 원하는 값을 저장할 수 있다. 해당 기법을 이용하여 원하는 시스템 함수를 호출할 수 있다. Signal signal은 프로세스에..

racc8n.kr

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를 확인할 수 있다.

  • Return address - buf 변수의 시작 주소 = 72

  • 즉, 72개 이상의 문자를 입력함으로써 Return address 영역을 덮어 쓸 수 있다.

Exploit 순서

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

    1. RSP : sigreturn() 함수 호출 후 이동할 주소("int 0x80" 명령어가 저장된 주소)
    2. RDI : "/bin/sh" 문자열이 저장된 주소
    3. RAX : execve() 함수의 시스템 콜 번호
    4. RIP : "int 0x80" 명령어가 저장된 주소
    5. CS : User Code(0x33)
    6. SS : User Data / Stack(0x2b)
  2. int 0x80 명령어 실행

 

확인해야 할 정보 목록

  • Libc offset
    • printf
    • "pop rax; ret"
    • "syscall"
    • "/bin/sh"명령가 저장된 영역

  • Gadgets

    • int 0x80

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

 

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

Excuse the ads! We need some help to keep our site up. List SROP(Sigreturn-oriented programming) SROP는 sigreturn 시스템 콜을 이용하여 레지스터에 원하는 값을 저장할 수 있습니다.해당 기법을 이용하여 원하는 시스템

www.lazenca.net

 

관련글 더보기

댓글 영역