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
'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 |