RTL
Return To Library
우선 RTL을 이해하기 전에 PLT와 GOT를 알아야 한다.
PLT & GOT
PLT (Prodecure Linkage Table)
- 사용자가 만든 함수 -> plt 참조할 필요 X
- 외부 라이브러리(stdio, stdlib 등)에서 가져다 쓸 경우 -> plt 참조
- 쉽게 말해서 외부 참조 함수들이 나열되어 있는 table 임
GOT (Global Offset Table)
- PLT에 존재하는 함수들의 실제 주소가 담겨있는 table
- 라이브러리에서 함수를 호출할 때 plt 가 got를 참조
이제 RTL을 어떻게 사용하는지를 알아보자.
RTL : Return To Library
보호기법
- DEP (Data Execution Prevention) : 데이터 실행 방지 -> 쉘 코드의 실행을 저지
- NX Bit (Never Execute Bit) : 지정된 모든 메모리 구역은 오직 데이터 저장만을 위해서 사용, 프로세스 명령어가 그곳에 상주하지 않음, shellcode 실행 불가
→ RTL을 이용하면 위와 같은 메모리 보호 기법들을 우회하여 쉘을 딸 수 있다.
Initial Settings
- ulimited -s unlimited : 스택의 한계를 정하여 주소 변화 X -> ASLR 우회
→ 스택이 더 이상 증가할 수 없을 때까지 증가하여 랜덤 매핑 방지
RTL 환경을 위해서 다음과 같은 코드를 작성하였다.
또한 메모리 구조는 다음과 같다.
기존의 Buffer Overflow 처럼 RET를 libc.so.6의 system 함수 주소로 덮는다. 반면, 기존의 Buffer Overflow 와는 다르게 ret 뒤에 dummy + parameter 가 추가되었다. 여기서 parameter를 추가한 이유는 ret 주소가 libc.so.6의 sysytem 함수 주소로 덮이면 system 함수를 실행하는 데에 인자가 필요하기 때문에 인자를 넣어준 것이다.
이제 RTL을 이용하여 코드의 흐름을 바꾸어 쉘이 실행되도록 만들어보자.
1) 우선 디버깅을 하기 위하여 각종 메모리 보호 기법을 해제 및 추가하여 환경 설정을 해준 뒤 컴파일하자.
dummy[4]는 기존의 ret adress를 호출하고 그 다음 ret address를 가리키는 용도이다. 위의 소스코드에서는 그 다음에 호출할 ret address가 없기 때문에 그냥 쓰레기값(dummy)로 채운다.
→ 이 dummy 값에 다른 함수의 주소를 넣어서 함수를 연속적으로 실행되게 하는 기법이 바로 RTL Chaining 이다.
2) 또한 gdb로 system 의 주소를 찾아낸다.
system 주소 -> 0xf7e40da0
3) 인자로 쓸 /bin/sh 의 주소를 알아내야 한다. 여기에는 두 가지의 방법이 있다.
3-1) system 함수 내에 “/bin/sh”라는 인자가 존재하기 때문에 이의 주소를 찾는 코드를 작성하여 뽑아내면 된다.
3-2) 명령어를 통하여 offset을 계산해 알아낼 수 있다.
우선 공유라이브러리 상에서의 offset을 구해보자. 여기서 offset이란 차이, 더해지는 값 등을 의미한다.
먼저 공유라이브러리 상에서의 system 함수의 주소를 구해보자.
system 주소 -> 0x3ada0
그리고 “/bin/sh” 문자열의 주소도 찾아주자.
/bin/sh 주소 -> 0x15ba0b
따라서 두 값의 차이, 즉 offset은 0x120c6b 이다. 실제 system 주소에 이 offset을 더해주면 “/bin/sh”의 실제 주소가 나올 것이다.
→ /bin/sh 실제 주소 : 0xf7e40da0 + 0x120c6b = 0xf7f61a0b
3-3) “/bin/sh” 문자열을 코드영역에 존재하는 간단한 아스키코드에 복사한다.
우선 “/bin/sh” 문자열을 복사할 간단한 아스키코드를 찾아보자. 코드영역인 0x0848000에서 찾아봤더니 0x53, 즉 “S”가 존재하였다. 이 문자열에 해당하는 주소를 사용하자.
“S” 주소 -> 0x8048f68
이제 이 문자열을 이름으로 한 실행파일에 “/bin/sh” 문자열을 복사하여 ./S 를 입력하더라도 쉘이 뜨도록 하자. 또한 현재 경로를 환경변수에 등록하여 S만 입력하여도 쉘이 뜨게 만들자.
4) 구한 주소들을 바탕으로 payload를 구성하여 쉘을 획득하자.
4-1) 3-1, 3-2를 이용
4-2) 3-3을 이용
'Pwnable > Techniques' 카테고리의 다른 글
Pwntools for me (0) | 2022.10.19 |
---|---|
FEBP (0) | 2020.08.29 |
FPO (0) | 2020.08.29 |
Prologue & Epilogue (0) | 2020.08.29 |