-
BOF 준비운동 (2)Wargame Site/BOF 2019. 4. 22. 15:37
STEP3 > Stack Frame
BOF 준비운동 (1) 에서 설명했던 것처럼 새로운 프레임에 접근할 때, Prolog 가 발생한다고 했다.
우선 이 Prolog 가 갖는 의미를 생각해보자.
Prolog 를 하는 근본적인 이유는 주소에 대한 효율적인 접근에 있다.
중요한 한가지 사실은 프로그램에서는 EBP 를 기준으로 변수를 지칭한다.
다음 그림에서와 같이 EIP 가 int a = 3, int b = 5, float c =7 이 실행됨에 따라 해당 Stack 에서는 다음과 같이 해당 정보들이 쌓인다.
EBP - 8, EBP - 12 와 같은 방식으로 a, b, c 를 지칭한다.
자, 만약 프레임이 교체되지 않는다면 어떤일이 발생할까?
프레임이 구분되어있지 않은 경우에 프로그램내의 변수들에 접근하기 위해서 offset 을 계산하는데 너무 많은 리소스를 사용하게 될 것이다.
이번엔 Prolog 가 있는 Stack 의 상황을 살펴보자.
만약 위 상황에서 n Frame 이 실행된다면,
다음과 같은 형태로 바뀌며, 변수 접근을 효율적으로 할 수 있다.
STEP4 > Call
하나의 프레임에서 다른 함수들을 호출하는 것을 종종 볼 수 있다.
이번 섹터에서 이해해야할 내용은 Call 이 발생하면서 Stack 에는 어떤 일이 일어나는지 파악하는 것이다.
자 결론부터 이야기하면 Call 을 하기 위해 기존 프레임의 다음 실행위치를 저장한 뒤, 해당 프레임으로 이동한다.
즉 Call 이라는 함수는 ' Push $eip + 5 ' 와 ' jmp n Frame ' 의 의미를 함축적으로 지니고 있다.
이 때 5인 이유는 Call [ ] 의 형태가 대부분 5 bytes 를 지니고 있기 때문이다.
만약 OP Code 가 5 바이트가 아닐 경우는 달라진다.
자, 이제 본격적으로 이해해보자.
우선 1 번인 Push $eip + 5 가 실행될 때 105 의 위치가 스택에 쌓이면서 ESP 에 변화가 생긴다.
2 번 jmp 0x800 을 실행하게 되면 EIP 가 0x800 으로 바뀌면서 Call 함수 실행이 끝난다.
STEP5 > Prolog
ESP, EBP 를 옮겨주기 위해 필요한 과정은 어떤 것들이 있을까?
PUSH EBP
MOV EBP, ESP
SUB ESP, N
1. PUSH EBP
기존의 실행중이던 프레임의 EBP 를 저장( PUSH )하는 과정이다.
함수를 빠져나갈시 돌아가야하는 EBP 를 적절히 다시 돌아가기 위함이다.
2. MOV EBP, ESP
스택의 꼭대기를 가르키는 ESP 를 프레임의 바닥을 담당하는 EBP 에 저장한다.
새로운 프레임의 시작을 알리는 구문이다.
3. SUB ESP, N
스택의 꼭대기에서 N 만큼의 공간을 확보한다.
본격적인 새로운 프레임 구조가 완성되는 순간이다.
이번엔 그림으로 이해해보자.
1번 PUSH EBP 를 실행하면 기존의 EBP 값이 저장되며, ESP 에 변화가 생기고,
2번 MOV EBP, ESP 이 실행되면 EBP 의 값이 ESP 와 같이진다.
마지막으로, SUB ESP, N 이 실행될 때 비로소 n Frame 의 스택구조가 완성이된다.
'Wargame Site > BOF' 카테고리의 다른 글
BOF ASLR (0) 2019.04.24 BOF 들어가기 앞서 (0) 2019.04.24 BOF 준비운동 (4) (0) 2019.04.23 BOF 준비운동 (3) (0) 2019.04.22 BOF 준비운동 (1) (0) 2019.04.21 댓글