감자 텃밭

[시스템] Return-to-Libc (RTL) 본문

System/System Hacking Techniques

[시스템] Return-to-Libc (RTL)

g2h 2021. 11. 20. 21:27

해당 기법은 프로그램이 정상적으로 종료되면 돌아갈 주소를 담고있는

RET영역에 메모리에 적재되어 있는 공유 라이브러리 함수의 주소로 변경하여, 해당 함수를 호출하는 방식의 기법이다.

 

해당 기법은 DIP/NXbit 메모리 보호기법을 우회할 수 있다.

 

해당 기법은 함수 에필로그를 이해하고 있어야 수월할 것이다.

https://hg2lee.tistory.com/60

 

[시스템] epilogue [에필로그 과정]

함수의 프롤로그가 있다면 에필로그도 있기 마련이죠 이번엔 함수 에필로그에 대해 다뤄보도록 하겠습니다. 우선 프롤로그 과정에서는 push ebp mov ebp, esp 과정을 통해 이루어집니다. 에필로그 과

hg2lee.tistory.com

보통 해당 기법은 RET영역에 system(), execv() 함수의 주소를 악의적으로 저장하게 되며,

RET영역을 넘어선 영역까지 덮을 수 있어야한다.

 

우선 일반 적인 Payload는 아래와 같다.

 

buf [64] | sfp [4] | ret [4] | argv[0] ...

위와같은 형식의 스택 구조를

buf + sfp [68] | ret [system()] | "\90"*4 | "/bin/sh"

위와같이 작성 해야한다.

 

그림을 통해 좀 더 상세하게 확인해보자.

 

정상적인 스택은 위와 같은 형태일 것이다 보통 RET 뒤쪽으로는 함수의 인자값(파라미터)이 존재한다.

여기서 해당 RTL 기법을 사용할 시 아래의 그림과 같다.

여기서 "/bin/sh" 은 해당 system() 함수의 인자값(파라미터)으로 받아오는 값이다

즉 system(/bin/sh) 로서 완성된 함수를 실행시키기 위해서이다.

 

system() 과 "/bin/sh" 사이에 AAAA또는 더미값 4바이트가 들어가는 이유는

해당 위치는 system() 도 함수이기에 system()함수가 호출이 되면 system()함수에 대한 스택 프레임이 생성 될 것이고.

https://hg2lee.tistory.com/58

 

Stack Frame ?

What is Stack?? - Stack이란 프로그램이 실행되면 지역변수, 매개변수, 반환값 등이 저장되는 메모리 공간이다. 메모리 구조를 간략하게 설명하게 되면 실제 메모리 구조는 좀 더 복잡하게 되어있지

hg2lee.tistory.com

해당 함수가 정상적으로 끝나면 다시 돌아갈 RET가 스택에 쌓이게된다.

그럼 RET의 위치가 해당 부분이 된다.

 

즉 RTL기법에서는 system() 함수가 실행되고 더 진행할 부분이 없기에

돌아갈 주소를 지정해주지 않는것이다. 해당부분에 다른 내용을 집어넣어 연속적으로 함수들을 수행하여 사용하는

RTL_Chaining 기법과 ROP 기법등이 존재한다. 

 

system()함수는 공유라이브러리에서 가져오며 (plt, got)

보통 /bin/sh 문자열은 libc파일에 존재하는 /bin/sh문자열의 주소를 찾거나, .bss영역에 저장 후 가져와서 쓰이게 된다.

위 내용들은 추후 포스팅 하도록 하겠다.

 


여기서 주의해야 할점은 위의 사용법은 아키텍처 x86인 32bit 기준이라는 것이다.

64bit 기준으로는 조금 다르게 접근해야한다. 큰 차이는 없다.

 

64bit 환경에서의 사용법이 다른 이유는 함수 호출규약 때문이다.

함수를 사용하기 위해서 우선적으로 레지스터에 순서가 맞게끔 데이터들을 저장한 후

함수들을 호출하여 사용하게 된다.

 

레지스터의 사용 순서는

RDI, RSI, RDX, RCX, R8, R9 ... 순서이다. 보통 RDI부터 3개를 많이 사용한다.

 

이를 어떻게 사용하냐하면, RET 영역에 바로 함수의 주소를 저장하는것이 아닌.

 

POP RDI와 같은 형식의 가젯이란 걸 저장하게 된다.

그 후 인자(파라미터)가 오고 그 다음에 함수가 오게된다.

즉 레지스터에 인자값(파라미터)를 넣은 후 함수를 호출하게된다. 아래 그림을 참조하자.

buf + sfp [68] | ret [pop rdi] | "/bin/sh" | "system()"

위와 같이 사용하게 된다. 

 

 

 

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

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

[시스템] GOT Overwrite  (2) 2021.11.22
[시스템] RTL-Chaining  (0) 2021.11.21
[시스템] Return-to-Shellcode  (0) 2021.11.20
[시스템] NOP sled 기법  (0) 2021.11.20
Return-to-csu 기법 정리  (5) 2021.11.15