RTL ( Return to Libc )
: DEP 메모리 보호 기법을 우회하는 공격 기법으로 실행 권한이 있는 공유 라이브러리를 통해 공격하는 기법이다
- shellcode의 호출이 필요없다
- RTL은 LIBC에 함수 호출을 하고 함수의 인자 값을 전달해야 한다
RTL ( Return to Libc ) 순서
1. root 권한으로 setuid가 설정된 파일 작성
2. 일반 계정으로 환경변수 주소 구하는 코드 작성
3. root 권한을 얻고 쉘을 실행시키는 코드 작성
4. 언어팩 세팅
5. 작성 코드 환경 변수 등록 후 주소 확인
6. 취약한 함수가 쓰인 프로그램을 gdb로 확인하여 변수의 시작 부분에서 EBP까지의 거리를 확인
7. 스택 구조 알기
8. 사용할 함수 주소 구하기
9. 일반 계정으로 root 권한 파일 실행 및 root 권한 획득
1. root 권한으로 setuid가 설정된 파일 작성
2. 일반 계정으로 환경변수 주소 구하는 코드 작성과 쉘코드 획득
3. root 권한을 얻고 쉘을 실행시키는 코드 작성
4. 언어팩 세팅
- 다른 환경변수를 등록하기 전에 언어팩 세팅을 제일 먼저 해줘야 다른 환경 변수의 주소가 바뀌지 않는다
- 기본 세팅인 영문은 1바이트로 동작하기 때문에 2바이트인 한글로 언어팩을 변경해준다 ( 로그아웃시 초기화 )
5. 작성 코드 환경 변수 등록 후 주소 확인
6. 취약한 함수가 쓰인 프로그램을 gdb로 확인하여 변수의 시작 부분에서 EBP까지의 거리를 확인
- root 권한으로 작성된 파일을 바로 gdb로 열게되면 동작이 제대로되지 않기 때문에 이름의 글자수를 똑같이하여 복사를 해준뒤 gdb로 열어서 확인한다
7. 스택 구조 알기
- 앞서했던 Buffer Overflow를 막기위한 보호기법 DEP를 우회하기 위해 RET 자리에 실행 권한이 있는 Shared Libc의 함수 execl 의 주소를 넣어 준다
8. 사용할 함수 주소 구하기
9. 일반 계정으로 root 권한 파일 실행 및 root 권한 획득
공격코드
buffer ~ EBP전 | EBP | RET | 함수의 RET | 인자 |
520bytes | 4bytes | execl 함수 주소 | 4bytes | 4bytes |
./bof "`perl -e 'print "A"x524, "[ 호출 함수 주소 ]", "A"x4, "[ 환경 변수 등록 공격 코드 주소]"x3'`"
( execl의 함수 원형은 인자를 최소 3개 이상을 받기 때문에 3을 곱해준다 )
'시스템 해킹' 카테고리의 다른 글
ASCII Armor (0) | 2020.11.10 |
---|---|
ASLR ( Address Space Layout Randomization ) (0) | 2020.11.10 |
DEP (Data Execution Prevention) (0) | 2020.11.06 |
Stack Buffer Overflow (스택 버퍼 오버플로우) (0) | 2020.11.06 |
Shellcode(쉘코드) 제작 (1) | 2020.11.04 |