반응형
Memory Layout
x86-64 Linux Memory Layout
- 최대 주소 값이 00007FFFF....FF 인 이유는 x86-64에서는 47 비트를 주소에 사용하기 때문
- 메모리 할당은 주소의 낮은쪽이나 높은쪽에서부터 된다
Memory Allocation Example
- malloc으로 할당한 메모리 중에 큰 메모리는 주소값이 큰 쪽에 할당되고, 작은 메모리는 주소값이 작은 쪽에 할당됨
- 계속 할당하다보면 사이에 존재하는 공간이 없어진다
Buffer Overflow : Vulnerability, Protection
Recall: Memory Referencing Bug Example
Such problems are a BIG deal
String Library Code
Vulnerable Buffer Code
Buffer Overflow Disassembly
- 24byte (0x18)에 해당하는 buffer가 할당되고 해당 위치를 gets() 호출을 위해 %rdi에 저장
- call_echo의 4006f6 주소 값은 return 주소이다
Buffer Overflow Stack
- 실제로 4바이트만 필요하지만 24바이트를 할당 받았기 때문에 20바이트는 사용되지 않은 채로 존재
Buffer Overflow Stack Example
- 23개의 문자로 구성된 String을 넣었을 때는 비록 echo()에서 계획한 4바이트는 넘었지만 추가적인 20바이트로 인해 딱 맞게 저장 가능하게 되었다
- 즉, buffer를 overflow했지만 state가 corrupt되지는 않았다
- 25개의 문자로 구성된 String을 넣었을 때 return 주소값을 변경시켜 버린다
- 즉, buffer도 overflow되고 return pointer를 corrupt시킨다
- 그리고 Segmentation Fault가 발생한다
- 24개의 문자로 구성된 String을 넣었을 때는 buffer의 overflow가 발생했고, return pointer를 corrupt했다
- 다만 프로그램은 정상 작동한다. 아래의 그림과 같은 이유로..
Code Injection Attacks
Q. 어떻게 exploit code로 딱 떨어지게 할 수 있는가?
A. 그게 해커다. 바이너리 코드에 대해서 잘 알고 gcc와 os가 어떻게 동작하는 지에 따라 코드를 작성할 것이다.
What to do about buffer overflow attacks
1. Avoid Overflow Vulnerabilities in Code
- fgets, strncpy는 적용되어야 하는 범위 내에서만 적용되는 메서드
2. System-Level Protections can help
- ASLR : Address Space Layout Randomization
- stack 영역에 랜덤 주소값을 넣음으로써 해킹으로부터 방어
- global, code 영역의 주소는 그대로이지만 local, heap 영역은 메서드가 호출될 때마다 주소값이 랜덤으로 할당
- Unix의 파일에서 Read, Write, Execute 권한이 있는 것과 유사
3. Stack Canaries can help
- 컴파일러에 의해 에러가 유발된다
Protected Buffer Disassembly
- stack에 24바이트를 할당
- 어떤 수를 8 offset of stack pointer에 할당
- 이후에 gets와 puts 호출
- test를 거쳐 에러를 던진다
Setting Up Canary
- offset 8 from stack pointer에 8바이트를 할당하는데, 그 수는 특별한 레지스터로부터 retrieve된다
- %fs는 유저모드에서 현재 스레드의 TEB(Thread Environment Block)을 가리킨다
Checking Canary
- 7 character 입력 이후에 gets와 puts를 호출하면 buffer가 overflow되어 문제가 생길 것이다
- 따라서 call 전에 canary의 위치와 비교한 이후 같다면 fail
Return-Oriented Programming Attacks
- ret 명령어는 0xc3로 인코딩되어 있는데 이를 이용하면 canary를 제외한 나머지 두 방식은 우회해서 공격 가능
Unions
Union Allocation
Using Union to Access Bit Patterns
Byte Ordering Revisited
Summary
반응형
'Computer Science Lectures > Introduction to Computer Systems - CMU' 카테고리의 다른 글
Lecture 08: Machine-Level Programming 4: Data (0) | 2022.10.31 |
---|---|
Lecture 07: Machine-Level Programming 3: Procedures (0) | 2022.10.25 |
Lecture 06: Machine-Level Programming 2: Control (0) | 2022.10.24 |
Lecture 05: Machine-Level Programming 1: Basics (0) | 2022.10.19 |
Lecture 04: Floating Point (0) | 2022.10.18 |