본문 바로가기

System Hacking

RTC (Return To CSU)

1. 정의

  • _ _libc_csu_init() 함수의 일부 코드를 Gadget으로 사용하는 기법이다.
  • gadget이 모자라거나 없는 경우, RTC기법을 사용한다.

2. _ _libc_csu_init() 함수 정의

  • 프로그램 실행 시, _init() 함수와 _ _preint_array, _ _init_array에 설정된 포인터를 읽어서 함수를 호출한다.

3.  _ _libc_csu_init에 존재하는 Gadget

  • _ _libc_csu_init()에서 가젯으로 사용하는 부분이다.

 

Gadget 1

  • RBX, RBP, R12, R13, R14, R15 레지스터에 값을 저장할 수 있다.

 

② Gadget 2

  • Gadget 1에서 저장한 레지스터를 이용해서 함수의 인자값으로 전달한다.
  • R13, R14, R15 레지스터에 저장된 값을 RDX, RSI, EDI레지스터에 저장한다.
  • R12에 저장되어 있는 주소를 호출한다. (단, RBX값이 0이어야 실행된다.)
    [주의] R12는 바로 실행되므로, plt주소를 넣으면 segmentation fault가 발생한다. 이로 인해, got주소를 넣어줘야 한다.
  • RBP는 RBX 값이 다르면 JNZ로 인해, LAB_00400860로 이동한다.
    이는 Gadget2의 함수 주소값이므로, 해당 부분이 재실행되어 원하는 코드를 계속적으로 실행할 수 있다.
    (이러한 현상은 Chaining이라고 한다.)

4. RTC 관련 Wargame

2022.07.08 - [Dreamhack/Wargame] - [Wargame] basic_rop_x64

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

Malloc(1) - chunk (glibc의 ptmalloc2)  (0) 2022.09.04
Fake EBP  (0) 2022.08.03
RTL (Return to Library)  (0) 2022.06.29
PLT & GOT  (0) 2022.06.27
NX & ASLR  (0) 2022.06.27