일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 프로그래머스
- 파일구조
- RVA
- dsa
- 코드업
- 알고리즘
- 인공지능
- codeup
- RSA
- 딥러닝
- Database
- 심층학습
- 암호학
- SQL_Injection
- ImageBase
- 공개키
- 디피헬먼
- SQL
- Cross Site Scripting
- 웹
- db
- XSS
- 머신러닝
- ReflectedXSS
- 기계학습
- StoredXSS
- dvwa
- C언어
- 보안
- injection
- Today
- Total
Ye0ngJae
RTL 기법에 대하여 알아보자 본문
RTL(Return To Libc)
기존의 BOF는 Shellcode를 넣어서 시작 주소로 RET를 덮어써줬다면, RTL은 실행파일과 링킹 된 Libc 안에 있는 라이브러리 함수의 주소를 ret에 넣어 변조시키는 공격 기법이다. 32bit와 64bit에서의 함수 인자 전달 방식이 다르므로 각 문제마다 RTL 방법이 다르다. 우선 RTL 기법에 대하여 알아보기 전에 PLT와 GOT를 알아둘 필요가 있다.
PLT(Procedure Linkage table)
외부 라이브러리 함수를 이용할 수 있도록 주소를 연결해주는 테이블
GOT(Global Offset Table)
PLT 함수를 통하여 구한 라이브러리의 절대 주소가 저장되어 있는 테이블
NX-Bit 우회
RTL 기법 혹은 ROP 기법을 이용하면 된다. RTL은 Libc 라이브러리에 있는 system 함수의 주소를 RET에 넣고, 인자로 ‘bin/sh’라는 문자열의 주소를 주어 셸을 획득할 수 있는 system 함수를 불러온다. 32bit의 경우 인자를 스택을 통해서 전달하므로 스택의 내용만 변조시키면 되지만, 64bit의 경우 인자를 레지스터를 통해서 전달한다. 레지스터는 사용자가 직접 변조할 수 없는 공간이므로 가젯을 이용하여 레지스터를 변조시켜야 한다. 32bit에 비해 조금은 복잡하다.
32bit의 경우
Libc 라이브러리 안에 있는 함수들에 Return을 하는 방법이다. system 내부 함수(shell과 같은 함수들)들의 주소를 넣어 해당 함수로 return을 하면 해당 함수가 실행되는 것을 확인할 수 있다. 이때 system의 실제 주소는 모른다. 웬만한 경우에는 ASLR 보호 기법이 적용되어 있어서 스택, 힙과 같은 라이브러리 주소들이 모두 랜덤화 되기 때문에 실제 주소는 알 수 없으나 system 함수의 PLT를 호출하게 되면 PLT에서 system의 주소도 찾아주고 실행해 주므로 굳이 실제 주소를 모르더라도 system의 함수의 PLT만 알고 있으면 익스플로잇 할 수 있다. 함수의 PLT는 PIE 보호기법이 걸려 있지 않으면 항상 고정이기 때문에, pwntools에서는 e.plt [’system’]을 이용하여 굳이 직접 찾지 않아도 따로 함수의 PLT를 저장할 수 있다.
64bit의 경우
셸을 얻으려면 가젯이라는 것을 이용해야 한다. 가젯은 메모리에 적재되어 있는 라이브러리 내의 코드 조각들이다. Libc 라이브러리 안에 system 함수를 처리하기 위해 /bin/sh라는 것도 존재할 것이다. 이 /bin/sh의 주소를 알아내고 이를 system의 인자로 넣으면 셸을 실행시킬 수 있을 것이다. 일부 문제에서는 문제 풀이를 쉽게 하기 위하여 /bin/sh를 전역 변수로 선언하는 경우도 있는데, 이는 IDA에서 Shift+F12를 눌러서 확인할 수 있다.
'정보보안 > 포너블' 카테고리의 다른 글
[Pwnable] PLT & GOT (0) | 2022.10.20 |
---|---|
[Pwnable] Libc leak과 GOT Overwrite (0) | 2022.10.20 |
메모리 보호 기법(Canary, NX Bit/DEP) (1) | 2022.09.26 |