상세 컨텐츠

본문 제목

JOP(Jump-Oriented Programming)

본문

JOP(Jump-Oriented Programming)

  • JOP는 JMP 명령어를 이용하여 프로그램의 흐름을 제어하는 Exploit 기술 이다.
  • JOP의 Gadget은 "Exploit에 필요한 코드 + JMP 명령어" 이와 같은 형태이며, 예를 들어 다음과 같은 Gadgets 이 사용된다.
    • x64환경에서 함수의 첫번째 인자 값에 0을 저장 : "mov rdi, 0; jmp [R9]"
    • x64환경에서 함수의 두번째 인자 값에 RSP에 저장된 값을 저장 : "mov rsi, [rsp]; jmp [R9]"
  • JOP는 여러개의 Gadget들을 실행하기 위해 별도의 Gadget과 구조가 필요하다.
    • "Example of JOP" 설명.
      • JOP Gadget들의 주소 값은 0x1000 ~ 0x1018 영역에 저장되어 있다.
      • rdx 레지스터에 "JOP Gadget들이 저장되어 있는 주소 - 8" 값(0x1000)이 저장되어 있다.
      • Overflow에 의해 return address 영역에 dispatcher Gadget의 주소를 덮어쓴다.
      • dispatcher Gadget은 다음과 같이 동작한다.
        • add rdx, 8 명령어에 의해 rdx에 저장된 값(0x1000)에 8을 더한다.(rdx : 0x1008)
        • jmp [rdx] 명령어에 의해 rdx가 가리키는 영역(0x1008)에 저장된 주소(0xffff0010)로 이동한다.
      • 0xffff0010 영역의 JOP Gadget은 다음과 같이 동작한다.
        • mov rax, [rax] 명령어에 의해 rax가 가리키는 영역에 저장된 값을 rax에 저장한다.
        • jmp rsi 명령어에 의해 dispatcher Gadget 으로 이동한다.
      • 이러한 형태로 나머지 JOP Gadget들도 실행될 수 있다.

Proof of concept

다음과 같이 Overflow를 확인할 수 있다.

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

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

Exploit 순서

  1. system 함수를 이용해 "/bin/sh" 실행

JOP structure

Stack addr Value
0x7fffffffe498 Gadget (POP RAX, ret) Address
0x7fffffffe4a0 System function address of libc
0x7fffffffe4a8 Gadget(POP RDI, JMP RAX) Address
0x7fffffffe4b0 First argument value

확인해야 할 정보 목록

  • "/bin/sh" 문자열이 저장된 영역
  • libc offset
    • printf
    • system

  • 가젯의 위치
    • POP RAX, ret
    • POP RDI, JMP RAX

Find gadget

exploit

 

 

REF : https://www.lazenca.net/pages/viewpage.action?pageId=16810290

 

13.JOP(Jump-Oriented Programming) - TechNote - Lazenca.0x0

Excuse the ads! We need some help to keep our site up. List JOP(Jump-Oriented Programming) JOP는 JMP 명령어를 이용하여 프로그램의 흐름을 제어하는 Exploit 기술 입니다.JOP의 Gadget은 "Exploit에 필요한 코드 + JMP 명령어" �

www.lazenca.net

 

댓글 영역