[gpg2권 박민근] 1.13 스택 와인딩

12
스스 스스스 (Stack Winding) GPG 2. Section 1. General Programming 1.13 DevRookie Study, 2011. 8. 6. 스스스

Upload: mingeun-park

Post on 10-Aug-2015

872 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: [Gpg2권 박민근] 1.13 스택 와인딩

스택 와인딩 (Stack Winding)

GPG 2. Section 1. General Programming 1.13

DevRookie Study, 2011. 8. 6. 박민근

Page 2: [Gpg2권 박민근] 1.13 스택 와인딩

처음 이 챕터를 읽었을때의 감상 ..

Page 3: [Gpg2권 박민근] 1.13 스택 와인딩

스택 와인딩

일반적인 의미 :

함수가 호출될때 , 호출한 함수의 호출 주소 및 로컬 변수등의 정보가 스택에 저장된다 .

이것을 ‘스택와인딩’이라고 한다 .

Page 4: [Gpg2권 박민근] 1.13 스택 와인딩

스택 와인딩

GPG 에서의 의미 :

이렇게 스택 와인딩을 통해서 저장된 정보를 조작하여 , 일반적으로는 불가능한 기법들을 수행하는 특수한 기법( 사실 쓰는걸 본적도 , 들은적도 없다… )

Page 5: [Gpg2권 박민근] 1.13 스택 와인딩

스택 언와인딩 (Unwding)

스택에 쌓인 지역 변수 및 함수들을 역으로 호출하면서 , 해제하는것을 ‘스택언와인딩’이라고 한다 .

이건 도대체 어디에 쓸까 ?

Page 6: [Gpg2권 박민근] 1.13 스택 와인딩

스택 언와인딩 (Unwding) try

{ if(! 수행할 코드 ) throw …}catch(...){ 예외가 발생했을 경우 수행할 코드}

throw 가 발생하는 경우 ,return 이 없어도 기존에 스택에 쌓인 함수들을 역순으로 호출하면서 , 지역 변수등을 자동으로 해제한다 .

이것이 ‘스택 언와인딩’이다 .

Page 7: [Gpg2권 박민근] 1.13 스택 와인딩

간단한 TempRet

① fn0(), fn1() 호출

② 이 함수를 호출한 곳의 다음 주소를 스택에서

가져온다

③ 가져온 주소를 실행한다 = 호출자의 다음

부분을 진행 한다 .

④ 실행이 다 끝나면 이 함수의 다음 부분을

진행한다 .

⑤ fn2(), fn3() 호출

Page 8: [Gpg2권 박민근] 1.13 스택 와인딩

간단한 TempRet 즉 ,

하나의 함수 안에서… 실행 중에 바깥 ( 호출자 ) 의 코드를 실행하고 난 후에 , 다시 함수 안으로 돌아와서 뒷 부분을 실행할 수 있다 !

헐 ~~~

Page 9: [Gpg2권 박민근] 1.13 스택 와인딩

TempRet 연쇄

① 각 함수들은 TempRet 앞까지만

호출 된다 .

② 35 줄의 jmp 로 게임이 실행된다 .

③ 게임이 종료되면 , 스택 언와인딩이

된다

④ 각 함수의 TempRet 뒷부분들이

역순으로 호출된다 .

Page 10: [Gpg2권 박민근] 1.13 스택 와인딩

썽킹 (Thunking) 앞 부분의 코드를 C++ 에서

인라인 어셈블러로 구현한 것

Page 11: [Gpg2권 박민근] 1.13 스택 와인딩

재귀 호출 ( 응용 )

① 재귀 함수를 호출하기 전에 호출자

( 바깥 함수 ) 의 주소를 저장해둔다 .

② 재귀 함수 내부에서 조건이 만족되

면 , 저장한 주소를 호출하여 바로

끝내버린다 .

※ 재귀 호출한 함수들을 거슬러

올라오는 부하를 없앨 수 있다 .

Page 12: [Gpg2권 박민근] 1.13 스택 와인딩

재귀 호출 ( 응용 )