일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- _IO_FILE
- BOF
- GOT overwrite
- vtable
- Android
- _IO_FILE Arbitrary Address Read
- heap feng shui
- Dynamic Analysis
- srop
- UAF
- DreamHack
- 나뭇잎 책
- shellcode
- ROP
- K-shield Junior
- malware
- Reversing
- DFC 2022
- seccomp
- _IO_FILE Arbitrary Address Write
- HackCTF
- DFB
- __environ
- RTL
- heap exploit
- H4CKING GAME
- master canary
- heap
- Lazenca
- tcache
- Today
- Total
Studying Security
Return to Libc (RTL) 본문
1. Return to Libc(RTL)이란?
Return address 영역을 공유 라이브러리 함수의 주소로 변경해, 해당 함수를 호출하는 방식
- NX bit(DEP)를 우회 가능
2. 함수 인자 전달 방식
x86 → 스택에 PUSH해서 전달
stack을 살펴보면 아래와 같은 구조를 지님
ebp-0x4 | sfp |
ebp | ret |
ebp+0x4 | ??? |
ebp+0x8 | arg1 = 1 |
ebp+0xc | arg2 = 2 |
ret영역과 4byte 간격을 두고 인자를 차례로 전달하고 있음
x64 → rdi, rsi, rdx, rcx, r8, r9, 스택을 이용 (인자의 개수에 따라 다음의 순서로 전달)
func함수의 register
rdi | 1 |
rsi | 2 |
3. RTL payload 구성
위에서 살펴본 함수의 인자 전달 방식을 토대로 RTL payload작성을 해보자
x86
ex) system("/bin/sh")
ebp-0x4 | sfp | |
ebp | ret | system |
ebp+0x4 | ??? | dummy |
ebp+0x8 | arg1 | "/bin/sh" 문자열 주소 |
위와 같이 overwrite 해주면 return시에 system함수로 넘어가고 인자로 "/bin/sh"이 전달 됨
인자가 2개, 3개 그 이상 되는 함수들도 비슷한 방식으로 그 아래로 인자를 더 전달하면 됩니다.
x64
x64의 경우 레지스터에 값을 전달해야 되기 때문에 gadget을 이용해 인자를 해당 레지스터에 전달한다.
ex) system("/bin/sh")
rbp-0x8 | sfp | |
rbp | ret | pop rdi |
rbp+0x8 | "/bin/sh" 문자열 주소 | |
rbp+0x10 | system |
위와 같이 overwrite 해주면 rdi에 "/bin/sh"을 넣고 system함수가 동작이 됨
인자가 2개, 3개 그 이상 되는 함수들도 비슷한 방식으로 gadget을 이용하여 해당 레지스터에 값을 넣어주고
해당 함수를 이어서 overwrite함으로써 원하는 동작을 하도록 유도할 수 있음
4. Reference
TechNote - TechNote - Lazenca.0x0
Skip to end of banner Go to start of banner TechNote Skip to end of metadata Lazenca.0x0님이 작성, 10월 31, 2019에 최종 변경 Go to start of metadata “html” 매크로 렌더링 오류 Notify your Confluence administrator that "Bob Swift Atlass
www.lazenca.net
'개념 정리' 카테고리의 다른 글
Master Canary (0) | 2022.05.18 |
---|---|
__environ (0) | 2022.05.11 |
_rtld_global (0) | 2022.04.28 |
SigReturn Oriented Programming (SROP) (0) | 2022.04.14 |
Return to Shellcode (0) | 2022.04.13 |