티스토리 뷰
Buffer overflow 란, 고정된 메모리 버퍼를 넘어서 접근해야 되지 않을 주소, 메모리 공간까지 넘어가 그 곳의 정보를 수정하거나 덮어쓰게 되는 것입니다. 덮어쓰는 내용을 특정 코드를 실행하도록 덮어 씌우는 공격이 바로 buffer overflow 공격입니다.
먼저 메모리 Stack 에 대한 내용을 알아야 될 것 같아 간단히 그림을 그려봅니다.
Process Memory
- heap
malloc, new 할당 동적 데이터 - stack
전역 변수, 콜Stack(함수 파라미터 / 리턴 어드레스) - data(global variabels)
- uninitialized data
- initialized data - code(or text)
프로그램 기계어 코드가 올라가는 영역
우리가 실행하는 Process 의 메모리 구조를 보면 1개의 Process는 1개의 stack 과 1개 이상의 heap을 가질 수 있습니다. BOF(Buffer Over Flow) 공격은 여기에서 stack 영역 중 Return Address 를 변경하여 메모리 내 특정 코드가 실행되도록 하는 공격 방법입니다.
실제 buffer overflow를 하기위해서는 scanf, strcpy, strcat 등 메모리를 조작하는 모든 함수를 통해서 가능합니다. 결론 부터 말씀드리면 *_s 함수를 통하면 buffer over flow 가 일어날 수 있는 일들을 원천 차단할 수 있습니다.
코드를 예로 들어 자세히 설명 드리면 sniper() 함수를 전혀 실행될 수 없지만, 이를 실행 할 수있도록 메모리를 변조해보도록 하겠습니다. 아래 코드는 단순히 subroutine 을 실행하고 subroutine 안에서 scanf 를 통해 입력받고 종료되는 코드입니다.
#include <stdio.h>
#include <stdlib.h>
int buf[4];
// 특정 메모리에 올라온 함수를 실행하는 방법
void sniper() {
system("dir");
}
void subroutine(int param) {
// buffer overflow 공격 지점
scanf("%s", buf);
}
int main() {
printf("SNIPER ADDRESS=[Ox%p]\n", sniper);
subroutine(4);
return 0;
}
Windows 에서 수행하기위해 Visual Studio 의 디버그-창-디스어셈블리 를 체크하고, subroutine 함수 수행 전 break point 를 지정하여 레지스터창을 이용하면 아래와 같이 어셈블리 코드를 확인 할 수 있습니다.
여기서 중요한 것은 레지스터 창의 ESP(Stack Pointer)의 주소를 디버그-창-메모리 를 이용하여 step 별로 함수에 진입하는 상태를 보면 먼저 파라미터 4를 stack 넣고, 그 다음 함수가 끝나고 돌아올 주소 즉, return address 를 stack 에 넣는 다는 것을 알 수 있습니다.
Buffo overflow 공격은 바로 stack 에 있는 return address를 변경하여 원하는 함수를 실행하여 공격하는게 목표 입니다. 간단히 return address를 원하는 함수 (sniper 함수 주소)로 변경하면 어떤 일이 생기는지 확인 해 보도록 하겠습니다.
함수가 정상적으로 종료되지는 않았지만, system("dir") 이란 sniper 함수가 수행되었음을 알 수 있습니다.
이제 남은 일은 buffer overflow 를 통해 return address 를 특정함수 (sniper ) 주소로 바꾸는 일만 남게 되었습니다.
- Total
- Today
- Yesterday
- backpropagation
- SvD
- gPRC
- DWT-DCT
- Residual Block
- numpy
- 네이버웹툰
- tensorflow serving
- keras
- Digital watermarking
- implementation
- dct
- 캡처방지
- flask serving
- DW
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |