SECURITY/System

[시스템보안] 14주차_코드 재사용 공격

yuujoeng 2022. 12. 5. 17:13

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()  함수 주소 출력

- runSystem()  함수 주소 출력
- /bin/sh 주소값 파악

- 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를 찾는다

- 네 함수의 주소값 획득

- a 파일에서 gadget 주소 찾기

- 주소 설정 (first_arg_val = second_arg_val = 임의의 값)

- 공격자용 프롬프트_1

- echo 서버용 프롬프트_1

- 공격자용 프롬프트_2

- echo 서버용 프롬프트_2