감자 텃밭

Return-to-csu 기법 정리 본문

System/System Hacking Techniques

Return-to-csu 기법 정리

g2h 2021. 11. 15. 01:05

포너블 문제를 풀며 64bit ROP를 진행할 때 가젯이 부족하거나 없는 경우가 존재한다.

[64bit ROP 는 rdi,rsi,rdx 와 같이 순서에 맞는 레지스터가 필요하기 때문]

 

보통 로컬에서 풀때는 해당 로컬에 립시파일에서 가젯을 찾을 수 있지만 보통 원격에서 문제를 풀 경우 문제와 함께

립시파일을 주지 않으면 립시파일에서 가젯을 찾을 수 없다. 이럴 경우 사용하는 기법이

RTC 이다.

 


RTC란 __libc_csu_init() 함수의 일부 코드를 Gadget으로 이용하는 기법이다.

함수가 실행될 때

위 사진과 같이, __libc_csu_init( ) -> _start( ) -> __libc_start_main( ) 를 거쳐서 main( )가 실행된다.

 

해당 기법을 사용하기 위해서는 2가지의 순서로 나뉘게 된다.

stage 1

첫번째로 스택에 있는 값들을 pop 을 통해 rbx, rbp, r12, r13, r14, r15에 저장하게된다. 

이때 RET의 주소는 pop rbx 부분에 맞춰 주어야 한다.

stage 2

다음으로 알아 보아야 할 부분이다.

r15, r14, r13의 값을 rdx, rsi, edi에 저장한다. 이를통해 레지스터를 제어할 수 있다.

여기서 중요한건 rdi가 아닌 edi에 저장한다 하지만 보통 rdi의 값은 8바이트 이상 사용하지 않기에 무방하다.

rdx, rsi, edi의 값을 세팅 후 call을 통해 r12+rbx*8 위치로 이동하게 된다.

 

이때 rbx의 값을 0으로 맞춰줘야 r12위치로 이동할 수 있다. 즉 r12위치에는 우리가 호출 하고자 하는

함수의 주소를 세팅해두면 된다.

 

이떄 주의해야할 점은 일반적인 ROP기법에서는 PLT 주소를 넣어주면 되었지만 RTC에서는 GOT주소를 세팅해줘야 한다.

그 이유는 PLT에는 GOT의 주소가 저장되어 있으며, r12에 적힌 값(주소)를 바로 실행하기 때문이다.

 

stage 2를 계속해서 살펴보면 r12위치의 값을 실행하고 rbx에 1을 더하고 rbp와 rbx를 비교한다. 비교한 값이

같다면 계속해서 명령어들이 이어져 간다. 만약 rbp의 값이 1면 csu_init부분으로 이동하여 즉 stage 1의 단계를 한번 더 실행할 수 있다 이를 통해 원하는 주소를 또 실행할 수 있게 된다.

 

해당 csu_init (stage 1) 부분을 보게 되면

add rsp, 8 부분이 있다. 해당 부분으로 인해 rbp 의 값을 1로 맞추고 다시 csu_init 로 이동했을때 add rsp, 8로인한 함수화가 일어난다. 해당 부분 때문에 페이로드 작성시 rbp의 값을 1로 맞추고 csu_init로 이동 할때 "A"*8 등의 8개의 더미값을 줘야한다. 

 


RTC 를 위해 csu 바이너리를 보면 가끔 레지스터의 순서가 다를 경우가 존재하니 이럴 경우 잘 보고 세팅해줘야 한다.

 

해당 부분은 r12 위치에 저장된 데이터를 참조한다는 것이다.

즉 포인터개념 ptr 개념이기 때문이다.main 함수로 돌아가고 싶을때는 main주소를 세팅하는것이 아닌 bss영역에 main주소를 넣어놓고 bss영역의 주소를 넣어줘야한다. 이렇기에 plt주소가 아닌 got주소를 넣는것이다 plt주소를 넣게되면 plt의 주소를 참조하는것이기때문이다.GOT 주소를 넣게되면 GOT에 존재하는 주소를 참조해 바로 실행시키기 때문이다.

 

또한 위의 사진을 보면 알겠지만 RTC의 함수를 호출하고 뒤 이어서 오는 인자의 순서는 역순으로 맞춰줘야 한다.

 

참고자료
https://jiravvit.tistory.com/entry/RTC-Return-to-CSU
https://py0zz1.tistory.com/107

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

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