64bit ROP
System/System Hacking

64bit ROP

728x90

Return Oriented Programming(ROP) _x86

NX bit와 ASLR 보호기법, 코드 서명과 같은 보호기법을 우회할 수 있는 기술

프로그램의 흐름 변경을 위해 Stack Overflow와 같은 취약점을 이용해 콜 스택 통제

→ 주로 스택 기반연산을 하는 코드 가젯(gadgets) 사용

>> RTL + Gadgets

 

(64bit: 함수의 인자를 레지스터와 스택에 저장해 전달)


gadgets

해당 프로그램이 사용하는 메모리에 이미 있는 기계 명령어

일반적으로 "ret"(반환명령어)이 끝으로,  기존 프로그램 또는 공유 라이브러리 코드 내의 서브루틴에 존재

 

x64에서는 호출 규약(System V AMD64 ABI) 때문에 피연산자가 매우 중요

 

x64의 ROP에서 POP 명령어의 역할

=  ESP 레지스터의 값을 증가시켜 함수를 연속으로 호출 / 호출할 함수에 전달될 인자 값을 레지스터에 저장

  인자 값은 stack에 저장되어 있음 >> 필요한 gadgets을 찾기 어려움

(ex.) gadgets 사용

- 호출할 함수의 첫 번째 인자 값 저장: "pop rdi; ret"

- 호출할 함수의 두 번째 인자 값 저장: "pop rsi; ret"

- 호출할 함수의 첫 번째, 인자 값 저장: "pop rsi; pop rdx; ret"

 

여러 개의 함수 연속 실행하는 방법

- gadgets을 이용해 인자 값을 레지스터에 저장한 후에 함수를 호출한다

 


Exaple

rop.c

$ gcc -fno-stack-protector -o rop rop.c -ldl

$ sudo chown root:root ./rop

$ sudo chmod 4755 ./rop

breakpoint 설정
check overflow - (1)

RSP(0x7ffc185074d8) (= return address)에 저장된 값: 0x4007d0 (main+46)

check overflow - (2)

 RSI(0x7ffc18507490) (= buf 변수의 시작 주소)에 저장된 값: 0x7f58ad437168

offset

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

 

Exploit Method

1. setresuid 함수를 이용해 권한을 root(0)으로 변경: setresuid(0,0,0)

2. system함수를 이용해 "/bin/sh" 실행: system(binsh)

확인할 정보 목록

- "/bin/sh"문자열이 저장된 영역

- libc offset: printf, system, setresuid

- gadget의 위치

  : pop rdi, ret

    pop rsi, ret

    pop rdx, ret

 

libc 영역에서 "/bin/sh"문자열이 저장된 영역 찾기

libc = 0x7f58acc42000

"/bin/sh" offset = 0x18cd57

 

Offset 구하기

printf(libcbase) offset: 0x55800

system offset: 0x45390

setresuid offset: 0xcd570

 

Gadget 찾기

 

"pop rdx ; pop rsi ; ret ;" : 0x001150c9

 

Exploit

ex.py

 

 

 

 

 

 

SMALL

'System > System Hacking' 카테고리의 다른 글

SROP x64  (0) 2020.07.24
SROP x86  (0) 2020.07.23
SROP  (0) 2020.07.23
32bit ROP  (0) 2020.06.14
RTL (Return to libc)  (0) 2020.05.24