Computer Science Lectures/Introduction to Computer Systems - CMU

Lecture 09: Machine-Level Programming 5: Advanced Topics

오렌지색 귤 2022. 11. 3. 22:25
반응형

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

오타인데 P()는 bar()가 아닌 Q()를 호출한다

 

 

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

반응형