상세 컨텐츠

본문 제목

02.RTL(Return to Libc) - x64

Pwnable Exploitation/03.RTL(Return to libc)

by RACC8N 2020. 5. 5. 23:17

본문

RTL이란 ?

- Return address 영역에 공유 라이브러리 함수의 주소로 변경해, 해당 함수를 호출하는 방식이다.

  • 해당 기법을 이용해 NX bit(DEP)를 우회 할 수 있다. 

Calling Convention

System V AMD64 ABI

  • Solaris, Linux, FreeBSD, macOS 에서 "System V AMD64 ABI" 호출 규약을 사용하기 때문이다.
    • Unix, Unix계열 운영체제의 표준이라고 할 수있다.
  • 해당 호출 규약은 다음과 같은 특징이 있다.
    • 레지스터 RDI, RSI, RDX, RCX, R8 및 R9는 정수 및 메모리 주소 인수가 전달된다.
    • 레지스터 XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6 및 XMM7은 부동 소수점 인수가 전달된다.
인자 전달 방법 Register (RDI, RSI, RDX, RCX, R8, R9, XMM0-7)
인자 전달 순서 오른쪽에서 왼쪽의 순서로 레지스터에 저장된다
함수의 반환 값 EAX
Stack 정리 호출한 함수가 호출된 함수의 stack 공간을 정리함

[EXAMPLE]

  • RDI : 0x1,  RSI : 0x2,  RDX : 0x3,  RCX : 0x4 순서로 인자값이 저장되어있다.

- ret2libc 기법을 사용하기 위해서는 각 레지스터에 값을 저장 할 수 있어야 한다.

  • 다음과 같은 방법으로 레지스터에 값을 저장 할 수 있다.
    • Return Address 영역에 "pop rdi, ret" 코드가 저장된 주소 값을 저장한다.
    • Return Address 다음 영역에 해당 레지스터에 저장 할 인자 값을 저장한다.
    • 그 다음 영역에 호출 할 함수의 주소를 저장한다.
stack 평상시 ret2libc
ebx-0x? BUF BUF
ebx SFP SFP
ebx+0x4 RET Gadget (POP RDI, ret)
ebx+0x8 Argv1 Argv1
ebx+0xC Argv2 system() 함수 주소

Proof of concept

  • main() 함수는 vuln() 함수를 호출한다.
  • vuln() 함수는 read() 함수를 이용해 사용자로 부터 100개의 문자를 입력받는다.
    • 여기에서 취약성이 발생한다. buf 변수의 크기는 50byte이기 때문에 Stack Overflow가 발생한다.
  • libc의 Base address를 얻기 위해 libc 영역에서 printf() 함수의 주소를 출력한다.

  • buf변수의 위치는 0x7fffffffe390 이며, Return address 위치와 72byte 떨어져 있다.
  • 즉, 사용자 입력 값으로 문자를 72개 이상 입력하면, Return address를 덮어쓸 수 있다.

- 다음과 같이 printf, system, /bin/sh의 offset을 구했다. 

 

- pop rdi ; ret 가젯을 구한다.

 

 

 

REF: https://www.lazenca.net/display/TEC/02.RTL%28Return+to+Libc%29+-+x64

 

02.RTL(Return to Libc) - x64 - TechNote - Lazenca.0x0

Excuse the ads! We need some help to keep our site up. List RTL(Return to Libc) RTL이란 Return address 영역에 공유 라이브러리 함수의 주소로 변경해, 해당 함수를 호출하는 방식입니다.해당 기법을 이용해 NX bit(DEP)�

www.lazenca.net

 

'Pwnable Exploitation > 03.RTL(Return to libc)' 카테고리의 다른 글

01.RTL(Return to Libc) - x86  (0) 2020.05.05

관련글 더보기

댓글 영역