작성자: JohnG
편집자: 엔시스
출 처: 보안인닷컴 팀 블로그[http://boanin.tistory.com]
요즘 회사일때문에 포스팅 해야지 해야지 한다면서 이제야 시간내서 글올리네요
많이 부족하지만 공부하면서 정리한내용 올립니다.
스택영역과 데이타영역을 비교해보니 '스택은 거꾸로 자란다'는 말이 이해되시죠? 먼저 선언된 순서에 따라 메모리에 자리를 잡는데 Data영역과 Stack영역이 반대로 진행되었습니다.
다시 한번 더 말하자면, 데이터영역은 변수가 선언된 순서대로 메모리의 낮은 주소에서 시작해서 할당이 되는데, 스택영역에서는 먼저 선언된 변수가 메모리 높은 주소에서 시작해서 할당 받는 것입니다.
3. 스택의 데이터 입력후 구조
buffer1에는 "1234567"이 들어가고 buffer2에는 "ABCDEFG"가 들어갔다고 가정한 결과의 모습입니다.
4. 함수 호출의 스택의 구조
자 이번에는 main함수 외에 다른 함수도 있고 함수에 인자가 주어진 경우에는 스택이 어떤모습인지 살펴보겠습니다.
자 함수내에서 함수가 호출될 경우와 함수에 인자가 주어진 경우 스택의 모습을 살펴보았습니다.
다음 강좌에서는 오퍼플로우될때 스택의 구조에 대하여 정리하겠습니다.
편집자: 엔시스
출 처: 보안인닷컴 팀 블로그[http://boanin.tistory.com]
요즘 회사일때문에 포스팅 해야지 해야지 한다면서 이제야 시간내서 글올리네요
많이 부족하지만 공부하면서 정리한내용 올립니다.
1. 프로그램 실행시 메모리의 구조
일반적인 스택의 구조는 다음과 같습니다.
/--------------------/ ← 메모리의 높은 숫자의 주소 | | | Stack | | | /------------------/ | | | Heap | | | /--------------------/ | | | Data | | | /--------------------/ | | | Text | | | /--------------------/ ← 메모리의 낮은 숫자의 주소 |
Heap영역이나 Data영역, Text영역에서 변수에 그 자리를 줄 때에는 "메모리의 낮은 주소"에서 부터 "메모리 높은 주소"로 순서대로 저장됩니다.
스택이 거꾸로 자란다는 것은, 위에서 말한 다른 메모리의 영역과는 반대로 변수에 그 자리를 내어줄 때에 "메모리의 높은 주소"에서부터 "메모리 낮은 주소" 입니다.
2. 예제
int a; int b; int c; //각각 a, b, c라는 전역변수가 순서대로 선언되었습니다. int main( void ) |
/-------------------------/ 메모리의 높은 숫자의 주소 | ret ① | | | | sfp(4byte)② | | | Stack | buffer1 ③ | | | | buffer2 ④ | /-------------------------/ | | Heap /-------------------------/ | c ③ | | b ② | Data | a ① | /-------------------------/ | | Text /-------------------------/ 메모리의 낮은 숫자의 주소 |
스택영역과 데이타영역을 비교해보니 '스택은 거꾸로 자란다'는 말이 이해되시죠? 먼저 선언된 순서에 따라 메모리에 자리를 잡는데 Data영역과 Stack영역이 반대로 진행되었습니다.
다시 한번 더 말하자면, 데이터영역은 변수가 선언된 순서대로 메모리의 낮은 주소에서 시작해서 할당이 되는데, 스택영역에서는 먼저 선언된 변수가 메모리 높은 주소에서 시작해서 할당 받는 것입니다.
3. 스택의 데이터 입력후 구조
/-------------------------/ 메모리의 높은 숫자의 주소 | ret | /-------------------/ | sfb(4byte) | /-------------------/ | 7 | | 6 | | 5 | | 4 | buffer1 | 3 | | 2 | | 1 | /-------------------/ Stack | G | | F | | E | | D | buffer2 | C | | B | | A | /-------------------------/ 메모리의 낮은 숫자의 주소 |
4. 함수 호출의 스택의 구조
자 이번에는 main함수 외에 다른 함수도 있고 함수에 인자가 주어진 경우에는 스택이 어떤모습인지 살펴보겠습니다.
void function( int a, int b, int c ) //function함수에 세개의 인자가 주어져 있네요. int main( void ) //main함수가 시작됩니다. |
자 함수내에서 함수가 호출될 경우와 함수에 인자가 주어진 경우 스택의 모습을 살펴보았습니다.
다음 강좌에서는 오퍼플로우될때 스택의 구조에 대하여 정리하겠습니다.
'Reverse Engineering > Reversing 이론 설명' 카테고리의 다른 글
[CPU] 8086 세그먼트와 오프셋의 개념 (0) | 2011.05.26 |
---|---|
[IDA] 단축키 Cheet-sheet (0) | 2011.02.25 |
[리버스_0x0a] 악성코드 분석 (0) | 2011.01.18 |
[리버스_0x09] 함께 공부하는 Reversing_6 (0) | 2011.01.18 |
[리버스_0x08] Reverse Engineering 中 알고리즘 확인 및 코딩 (0) | 2011.01.18 |