1 코드 재사용 공격
(1) 정의
- 악성 코드를 공격 대상 시스템에 삽입하기 보다는 공격 대상 시스템에 존재하는 코드를 재사용하여 악성행위를 구현
- Return-to-Libc(RTL) : libc 라이브러리에 있는 코드를 재사용해서 악성행위를 구현
- Return-Oriented Programming(ROP) : 공격 대상에 존재하는 ret으로 종료되는 명령어 gadget을 악용
2 RTL 공격
(1) 공격용 코드 주소 파악
- 라이브러리(libc) 프로그램 코드 : system(), exit()
- /bin/sh 주소를 환경변수로 설정하여 주소 파악
(2) 버퍼 오버플로우 취약점 이용
- 악성 쉘코드를 주입하지 않고(NOP 제외) 주소를 주입함
- 주소들을 통해 악성행위가 성립되도록 하는 것
(3) 버퍼 오버플로우 공격 방어
- 스택 주소 Randomization > 주소를 가변적으로 할당
- 코드 Randomization > ASLR(Address Space Layout Randomization)
- W "XOR" X > 실행과 쓰기가 동시에 실행되지 않도록 상호배제
3 ROP 공격
(1) Gadget
- Gadget: ret으로 종료되는 명령어 시퀀스
- 라이브러리 코드에서 gadget을 탐색함
- 우리가 사용하는 함수들은 ret로 종료되어야 함 > 하나의 gadget에서 다른 gadget으로 연결시키는 연결자 역할 수행
(2) Gadget을 통한 코드 실행
- 최종 결과: 특정 주소에 /bin의 주소를 넣어주는 것
- 스택 주소 Randomization : X, 코드 영역에서 실행되는 것이므로 스택이 사용되지 않음
- W "XOR" X : X, 코드 영역에서 실행되는 것이므로 스택이 사용되지 않음
- ASLR(Address Space Layout Randomization) : 코드 영역에 대한 방어책이 가장 효과적임
- 주소가 지나치게 길게 나열되어 있을 경우에도 의심해볼 수 있음
- ret와 같은 역할을 하는 다른 gadget도 만들어낼 수 있음
4 실습
(1) RTL 공격
- cho_retlib.c는 RTL 공격을 위해서 사용되는 파일이고, echo_server_RTL.c는 RTL 공격의 대상이 되는 echo 서버 파일
- 두 개의 터미널을 화면에 띄운다. 첫 번째 터미널은 공격자용으로 사용되고, 두 번째 터미널은 echo 서버용으로 사용
- 공격자용 터미널과 서버용 터미널 모두에서 /bin/sh를 환경변수로 설정
- 시스템 상에서 주소 난수화를 비활성화
- runExit() 함수 주소 출력
- echo_retlibc.c에 찾아낸 주소 넣기 (/bin/sh - 0xA)
- 몇 번째 버퍼에 들어가는지 넣기
- 공격자용 프롬프트_1
- echo 서버용 터미널_1
- 공격자용 프롬프트_2
- echo 서버용 터미널_2 > 쉘 프롬프트 #이 뜨고, 임의의 리눅스 명령어(ls, ps, df, date, ps –aef)를 입력해도 실행됨
(2) ROP 공격
- echo_rop.c는 ROP 공격을 위해서 사용되는 파일이고, echo_server_ROP.c는 ROP 공격의 대상이 되는 echo 서버 파일
- ret gadget을 사용하여 pop으로 다시 돌아오게 함
- 공격자용 터미널상에서 echo_rop.c 파일을 열어서, ROP Attack Part를 찾는다
- 네 함수의 주소값 획득
- 주소 설정 (first_arg_val = second_arg_val = 임의의 값)
- 공격자용 프롬프트_1
- echo 서버용 프롬프트_1
- 공격자용 프롬프트_2
- echo 서버용 프롬프트_2