시스템해킹_3주차

2022. 9. 23. 22:2922-2학기 (SISS)/시스템해킹

https://dreamhack.io/lecture/roadmaps/2

 

System Hacking

시스템 해킹을 공부하기 위한 로드맵입니다.

dreamhack.io

3주차 (9/19 ~ 9/25) : STAGE 5


STAGE 5 : Stack Buffer Overflow


1. Calling Convention

[Background : Calling Convention]

1. 서론

1) 함수 호출 규약

-함수 호출 규약 : 함수의 호출 및 반환에 대한 약속이다. 

함수를 호출할 때는 반환된 이후를 위해 호출자(caller)의 상태(stack frame) 및 반환 주소(return address)를 저장해야 한다. 또한, 호출자는 피호출자(callee)가 요구하는 인자를 전달해줘야 하며, 피호출자의 실행이 종료될 때는 반환 값을 전달받아야 한다.

함수 호출 규약을 적용하는 것은 컴파일러의 몫이다. 따라서 대개의 프로그래머는 함수 호출 규약을 알지 않아도 코드를 작성하는데 문제가 되지 않는다. 그런데 컴파일러의 도움 없이 어셈블리 코드를 작성하거나 읽으려 한다면 함수 호출 규약을 알고 있어야 한다. 

 

2) 함수 호출 규약의 종류

 

2. x86 호출 규약 : cdecl

1) cdecl

-x86 아키텍쳐 

  • 레지스터의 수가 적기 때문에, 스택을 통해 인자를 전달한다. 
  • 인자를 전달하기 위해 사용한 스택을 호출자가 정리한다.
  • 스택을 통해 인자를 전달할 때는 마지막 인자부터 첫 번째 인자까지 거꾸로 스택에 push한다.

 

3. x86-64 호출 규약 : SYSV

1) SYSV

-SYSV ABI는 ELF 포멧, 랭킹 방법, 함수 호출 규약 등의 내용을 담고 있다.

 

4. 결론

1) 코드 요약 / 퀴즈


[Quiz : Calling Convention]


2. Stack Buffer Overflow

[Memory Corruption : Stack Buffer Overflow]

1. 서론

스택 버퍼 오버플로우는 역사가 오래되고 대표적인 취약점이라고 할 수 있다. 스택 버퍼 오버플로우는 아직도 많은 소프트웨어에서 발견되고 있다. 

 

2. 스택 버퍼 오버플로우

1) 버퍼 오버플로우

-버퍼(Buffer)

  • 일상에서는 완충 장치라는 의미로 사용되고, 컴퓨터과학에서는 데이터가 목적지로 이동되기 전에 보관되는 임시 저장소의 의미로 사용된다.
  • 데이터의 처리속도가 다른 두 장치가 있을 때, 이 둘 사이에 오가는 데이터를 임시로 저장해 두는 것은 일종의 완충 작용을 한다.
  • 데이터를 수신하는 측과 송신하는 측의 속도 차이로 인한 데이터 유실 문제를 해결하기 위해 임시 저장소를 두고, 이를 통해 간접적으로 데이터를 전달한다.
  • 송신 측은 버퍼로 데이터를 전송하고, 수신 측은 버퍼에서 데이터를 꺼내 사용한다. 이렇게 하면 버퍼가 가득찰 때까지는 유실되는 데이터 없이 통신할 수 있다.
  • 즉, 데이터가 안정적으로 목적지에 도달할 수 있도록 완충 작용을 하는 것이 버퍼의 역할이다.

-버퍼 오버플로우(Buffer Overflow)

  • 버퍼 오버플로우는 버퍼가 넘치는 것을 의미한다.
  • 버퍼 오버플로우는 일반적으로 어떤 메모리 영역에서 발생해도 큰 보안 위협으로 이어진다.

2) 중요 데이터 변조

버퍼 오버플로우가 발생하는 버퍼 뒤에 중요한 데이터가 있다면, 해당 데이터가 변조됨으로써 문제가 발생할 수 있다.

 

3) 데이터 유출

c언어에서 정상적인 문자열은 널바이트로 종결되기 때문에 표준 문자열 출력 함수들은 널바이트를 문자열의 끝으로 인식한다. 그런데 만약 어떤 버퍼에 오버플로우를 발생시켜서 다른 버퍼와의 사이에 있는 널바이트를 모두 제거하면, 해당 버퍼를 출력시켜서 다른 버퍼의 데이터를 읽을 수 있다. 이렇게 획득한 데이터는 각종 보호기법을 우회하는데 사용될 수 있고 해당 데이터 자체가 중요한 정보일 수 있다.

4) 실행 흐름 조작

스택 버퍼 오버플로우로 함수의 반환 주소(Return Address)를 조작하면 프로세스의 실행 흐름을 바꿀 수 있다.

 

3. 마치며

스택 오버플로우는 역사가 깊은 취약점인 만큼 다양한 보호 기법들과 이를 다시 우회하는 기법들이 연구되어 왔다.


3. [함께실습] Stack Buffer Overflow

[Exploit Tech : Return Address Overwrite]

1. 서론

스택 버퍼 오버플로우가 발생하면 반환 주소가 조작될 수 있는데, 이 취약점이 존재하는 예제 프로그램을 공격하고 셸을 획득하는 실습을 배울 것이다.

 

2. 분석

1) 취약점 탐색 / 트리거

-취약점 분석

  • 프로그램의 취약점은 scanf("%s", buf)에 있다.
  • %s는 scanf 함수의 포맷 스트링 중 하나로 문자열을 입력받을 때 사용하는 것이다.
  • %s는 입력의 길이를 제한하지 않으며 공백 문자인 띄어쓰기, 탭, 개행 문자 등이 들어올 때까지 계속 입력을 받는다는 특징이 있다.
  • c/c++의 표준 함수 중, 버퍼를 다루면서 길이를 입력하지 않는 함수들은 대부분 취약점이 존재한다고 생각해야 한다.

-> 이런 특징 때문에 버퍼의 크기보다 큰 데이터를 입력하면 오버플로우가 발생할 수 있다. 

-> scanf에 %s 포맷 스트링은 절대로 사용하면 안된다.

 

-트리거(trigger)

  • 발견한 취약점을 확인해보는 행위를 취약점을 발현시킨다는 의미에서 트리거라고 표현한다.

2) 코어 파일 분석

gdb에는 코어 파일을 분석하는 기능이 있다. 이를 이용하면 입력이 스택에 어떻게 저장되었는지 살펴볼 수 있다.

 

3. 익스플로잇

1) 스택 프레임 구조 파악

- 스택 버퍼 오버플로우를 발생시켜서 반환주소를 덮으려면, 해당 버퍼가 스택 프레임의 어디에 위치하는지 알아야 한다. 이를 위해선 main의 어셈블리 코드를 살펴보아야 한다.

- 입력할 버퍼와 반환 주소 사이에 거리가 있다면, 그만큼을 쓰레기 값(dummy data)로 채우고, 실행하고자 하는 코드의 주소를 입력하면 실행 흐름을 조작할 수 있다.

 

2) get_shell() 주소 파악 / 페이로드 구성

- get_shell() 함수의 주소로 main 함수의 반환 주소를 덮으면 셸을 획득할 수 있다.

- 페이로드(payload)

  • 시스템 해킹에서 페이로드는 공격을 위해 프로그램에 전달하는 데이터를 의미한다.
  • 익스플로잇에 사용할 페이로드를 구성해야 한다.

3) 엔디언 적용

- 엔디언(Endian)

  • 엔디언은 메모리에서 데이터가 정렬되는 방식으로 주로 리틀 엔디언(Little-Endian, LE)과 빅 엔디언(Big-Endian, BE)이 사용된다.
  • 구성한 페이로드는 적절한 엔디언을 적용해서 프로그램에 전달해야 한다.
  • 리틀 엔디언에서는 데이터의 MSB(가장 왼쪽의 바이트)가 가장 높은 주소에 저장되고, 빅 엔디언에서는 데이터의 MSB가 가장 낮은 주소에 저장된다.
  • 익스플로잇을 작성할 때는 대상 시스템의 엔디언을 고려해야 한다.

4) 익스플로잇 실행

엔디언을 적용하여 페이로드를 작성하고, 이를 다음의 커맨드로 전달하면 셸을 획들할 수 있다. 

 

4. 부록 : 취약점 패치

1) 취약점 패치

취약점을 발견하는 것만큼 중요한 것이 발견한 취약점을 패치하는 것이다.

취약점을 패치하기 위해서는 c언어에서 자주 사용되는 문ㄴ자열 입력 함수와 패턴들, 그리고 각각의 특징을 알아야 한다.

5. 마치며

이번 강의에서는 get_shell()이라는 함수를 정의하여 사용하였으나, 실제로는 그렇지 않으므로 앞으로의 강의에서는 저런 함수 없이도 셸을 획득할 수 있는 방법을 배워야 한다.

 


[Return Address Overwrite]

DH{5f47cd0e441bdc6ce8bf6b8a3a0608dc}


4. [혼자실습] Stack Buffer Overflow

[basic_exploitation_000]

DH{465dd453b2a25a26a847a93d3695676d}


[basic_exploitation_001]

DH{01ec06f5e1466e44f86a79444a7cd116}

 

'22-2학기 (SISS) > 시스템해킹' 카테고리의 다른 글

시스템 해킹_4주차  (1) 2022.09.30
시스템해킹_2주차  (0) 2022.09.22
시스템해킹_1주차  (0) 2022.09.11