감자 텃밭

[시스템] Return-Oriented-Programming - ROP [x64-64bit] 본문

System/System Hacking Techniques

[시스템] Return-Oriented-Programming - ROP [x64-64bit]

g2h 2021. 11. 23. 02:32

기본적인 ROP사용법은 32bit ROP에서 확인하자.

https://hg2lee.tistory.com/71

 

[시스템] Return-Oriented-Programming - ROP [x86-32bit]

ROP기법이란 Return-Oreinted-Programming의 약자로 반환 지향형 프로그래밍 이다. ret영역에 가젯을 이용하여 연속적으로 함수를 호출하며 공격자가 원하는 흐름대로 프로그래밍 하듯 공격한다는 뜻의

hg2lee.tistory.com

 

64bit ROP는 32bit ROP와 사용법이 살짝 다르다.

 

32bit ROP에서는 POP POP ret 등의 가젯에서,

pop 명령어의 피연산자의 종류가 상관이 없었다.

 

하지만 64bit 환경에서는 이 피연산자의 종류가 중요하다 

 

그 이유는 호출 규약인 System V AMD64 ABI로 인한,

64bit 환경에서는 함수를 호출할 때 우선적으로 인자값을 레지스터에 저장 후

함수를 호출하기 때문이다.

 

x64 ROP에서 POP 명령어의 역할은 아래와 같이 분류할 수 있다.

 

 


1. ESP 레지스터의 값을 증가시켜 함수를 연속으로 호출하는 것
2. 호출할 함수에 전달될 인자 값을 레지스터에 저장하는 것
3. 인자 값은 Stack에 저장되어 있음

이러한 역할로 인해 x64 ROP에서는 Gadget을 찾기가 어려워 진다.

 

레지스터 저장에도 사용되는 레지스터에는 순서가 존재한다.

보통 RDI, RSI, RDX, RCX, R8, R9 ... 순서로 사용되며,

 

호출할 함수의 전달되는 인자값들을 저장하기 위해서 아래의 형태와 같이 사용된다.

● 첫 번째 인자 값을 저장 : pop rdi; ret
● 두 번째 인자 값을 저장 : pop rsi; ret
● 세 번째 인자 값을 저장 : pop rdx; ret

보통 3개를 쓰며, 그 이상일 경우 위의 레지스터 순서대로 사용된다.

 

또한,  3개를 한번에 사용할 경우, 순서가 섞여 첫 번째, 세 번째 인자값을 저장할 경우는 아래와 같이 쓰인다.

● 한번에 3개를 사용 : pop rdi; pop rsi; pop rdx; ret
● 첫 번째, 세 번째 값을 저장 : pop rdi; pop rdx; ret

 

Payload 에서의 사용법을 살펴보기 위해 아래 사진을 참고하자.

위 Payload를 보면

pop rdi; ret가젯과 pop rsi; pop rdx; 가젯 두 개를 사용 하여 레지스터에 값을 넣고 필요 함수를 호출한다.

 

x64와 x32ROP 의 차이는 레지스터에 값을 저장 후 함수를 호출하는것을 제외한 나머지

방법은 동일하다.

 

 

참고자료 
https://www.lazenca.net/display/TEC/02.ROP%28Return+Oriented+Programming%29-x64

※ 내용이 이상하거나 문제가 있을경우, 또는 설명에 부족한 내용이 있으시면 알려 주시면 감사합니다.