이론/buffer overflow_달고나bof

프로그램 실행 시 Segment 에서는

O'bin 2022. 7. 17. 19:37

프로그램 실행 -> 프로세스가 메모리에 적재 -> 메모리와 레지스터 동작

 

위 과정에 대해 알아보기 위해 간단한 프로그램 동작 분석

 

1
2
3
4
5
6
7
8
9
10
//simple.c
 
void function(int a, int b, int c){
    char buffer1[15];
    char buffer2[10];
}
 
void main(){
    function(1,2,3);
}
cs

 

gcc -S -o simple.asm simple.c : 위 c 프로그램을 어셈블리 코드로 컴파일

gcc -o simple simple.c : 위 c 프로그램을 실행파일로 컴파일

 

gdb로 열어 어셈블리어로 프로그램 분석

 

 

 

 

ESP는 프로그램 처음 시작 시 스택 맨 꼭대기를 가리키고 있음

함수 프롤로그는  push %ebp, mov %esp,%ebp부분으로,

이전 함수의 base pointer를 저장하고 새로 지정하는 과정

EIP(instruction pointer)는 Main함수의 시작점을 가리키고 있음

 

 

 

 

 

 

 

 

ESP에서 sub 연산 시 뺀 크기 만큼 stack이 확장된다.

확장된 스택 원상복구 시에는 ESP에 add연산이 진행된다. 

 

 

 

 

 

 

 

 

 

stack segment 영역에 버퍼, 지역변수가 저장된다.

function(1,2,3)에서 stack 구조상 3,2,1 순으로 push해야 1,2,3 순서대로 꺼내서 사용할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

return address는 buffer overflow공격에서 중요하게 이용되는 지점이고, stack segment에 저장된다.

function함수도 main함수와 마찬가지로 함수 시작 시 프롤로그 과정을 거친다.

 

 

 

 

 

 

 

 

 

 

 

 

 

buffer1[15]를 위해 16byte

buffer2[10]를 위해 16byte

dummy 8byte

=> 총 40byte의 stack segment 확장

 

 

 

 

 

 

 

 

 

 

 

 

이 코드에서 버퍼에 값을 넣는 동작은 없다.

버퍼 공간이 어떻게 생기는지 이해하고 넘어가면 된다.

 

 

 

 

 

 

 

 

 

 

stack segment만 확대한 모습니다.

위 과정을 이해한다면 이 그림의 값들이 어디서 나와 저장되어 있는지 알 수 있다.

 

 

 

 

 

 

 

 

 

 

함수 실행이 끝났으므로 확장된 stack 공견을 없애고 이전 함수의 base pointer, return address로 복귀

 

 

 

 

 

add %esp명령으로 확장했던 stack을 다시 복구하고 RET 명령을 따라 원래 주소값으로 복귀하고 나머지 main 함수를 실행한다.

 

 

 

 

스택 구조에 대해 정리가 되지 않는 느낌이었는데, 이번 공부를 통해 왼쪽의 코드가 있으면 오른쪽과 비슷하게 대략적인 구조를 머릿속에 그릴 수 있게 되었다.

'이론 > buffer overflow_달고나bof' 카테고리의 다른 글

8086 CPU 레지스터 구조  (0) 2022.03.29
8086 Memory Architecture  (0) 2022.03.29