tmxklab

RTC(Return to csu) 본문

Security/01 System Hacking

RTC(Return to csu)

tmxk4221 2020. 9. 15. 17:12

1. RTC(Return to csu)

ROP를 해야하는데 가젯 제한으로 rdi, rsi, rdx를 구성하기 힘들 때 유용하게 사용할 수 있는 기법으로 __libc_csu_init()을 이용한다.

 

csu & __libc_csu_init() 참고 자료)

 

Linux Binary Execution Flow(main함수 호출 및 종료 과정)

main()가 호출되고 종료되는 과정에 대한 지식이 필요하여 이번에 정리하게 되었다. 우리가 흔히 .c파일을 작성하여 컴파일 과정을 마치면 결과물로 linux실행파일인 elf파일이 생성된다. 이제 elf파

rninche01.tistory.com

위 참고 자료를 보면 알 수 있듯이 __libc_csu_init()에서는 __init_array에 설정된 함수 포인터를 읽어서 호출하는 과정이 있는데 이 부분을 이용하여 rsi, rdi, rdx를 쉽게 구성할 수 있다.

 


2. Attack Process

ret를 조작할 수 있는 상황에서 크게 2가지 과정을 거쳐 rsi, rdi, rdx를 세팅하여 원하는 함수를 호출할 수 있다.

 

[ stage 1 ]

stage 1은 stage 2를 실행하기 전에 스택에 있는 값을 pop하여 알맞게 레지스터에 값을 세팅하는 작업이다.

ret를 주작하여 __libc_csu_init()의 다음 루틴으로 이동했을 때 상황이다.

위 그림을 보면 알 수 있듯이 ret를 주작하고 스택에 적절한 값을 세팅해야 한다.

 

여기서 rbp를 0x1로 세팅하는 이유는 RTC Chaining을 하기 위함이다.

 


[ stage 2 ]

stage 1에서 알맞게 값을 세팅하고 stage 2로 넘어온 상황이다.

call까지 진행되기 전까지 r13, r14, r15d에 있는 값을 rdx, rsi, edi로 복사된다.

rdx = r13(0xa), rsi = r14(0xb), edi = r15d(0xc)

 

그리고 마지막으로 call [r12 + rbx*0x8] 을 수행하게 되는데 rbx에는 0x0이 들어 있고

r12에는 호출하고 싶은 함수의 주소가 들어 있으므로 결과적으로

" call 호출하고 싶은 함수의 주소 "

로 수행하게 된다.

 

그리고 add rbx, 1 를 수행하게 되면 rbx는 1로 세팅되고 rbp에는 1로 세팅되어 있으므로 cmp rbx, rbp를 수행하게 되면 stage 1으로 이동하게 되면서 한 번더 RTC를 진행할 수 있다.

 


3. 참고자료

 

RTC 참고자료) - 정리가 잘 되어있음

 

 

Return-to-Csu 기법 정리

포너블 문제를 풀 때, 64Bit 바이너리가 까다로운 이유가 바로 'Gadget' 때문이다. 64Bit의 Calling Convention은 Fastcall로 호출된 함수에 인자를 레지스터로 전달한다. 이 때문에 Exploit을 구성할 때도 [POP R.

py0zz1.tistory.com

RTC관련 문제)

 

 

[HackCTF/Pwnable] rtc

해당 문제는 RTC(Return To Csu)기법에 관한 문제이다. 1. 문제 nc ctf.j0n9hyun.xyz 3025 1) mitigation 확인 2) 문제 확인 입력을 한 번 받고 끝난다. 3) 코드 흐름 확인 3-1) main() int __cdecl main(int..

rninche01.tistory.com

 

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

Linux Memory Protection  (0) 2020.09.15
FSOP(File Stream Oriented Programming)  (0) 2020.09.15
FSOP를 위한 fclose()분석  (0) 2020.09.15
stdout flag를 이용한 libc leak  (6) 2020.08.26
heap(5) - tcache 정리  (0) 2020.08.24
Comments