728x90
위 코드의 스택프레임을 정리할려고 한다.
RET이 스택의 가장 아래쪽이다.(스택이 위로 쌓인다고 가정할때) (스택은 주소값상에서는 위에서부터 아래로 쌓인다.)
RET(return address)은 함수종료후 돌아갈 주소를 가리킨다.
main함수 실행 전 _start가 실행되고 _start에서 main을 호출하는데 main함수가 종료되면 다시 _start로 돌아온다. 이때 돌아가는 주소가 RET에 저장되어 있다.
함수의 BASE포인터가 RET 바로위에 저장되고 RBP 이후로 지역변수들이 차례로 저장된다. 변수 C가 RBP바로 위에 저장된 모습이다.
함수를 호출할 때 그함수의 매개변수는 그함수의 RET 아래에 저장된다.
sum을 호출할때 매개변수 x, y가 sum의 ret 아래에 저장된 모습이다.
sum 함수가 종료되면 변수 X ~ RBP, 버퍼 까지 모든 스택들이 사라진다. 그리고 변수 C에는 3이 들어간다.
sum의 반환을 통해 변수 C에 3이 저장된 형태이다. 메인함수가 종료되면 3도 main함수가 호출된 곳으로 반환한다.,
RET의 경우 함수 종료 후 돌아가는 메모리 주소가 저장되어있다. bufferover flow를 통해 ret을 조정하여 임의로 원하는 주소로 이동이 가능하다.
728x90
'Programming > assembly' 카테고리의 다른 글
어셈블리 문법 (0) | 2020.03.01 |
---|---|
echo (0) | 2020.03.01 |
메모리 구조 (0) | 2020.03.01 |
Hello World (x64) (0) | 2020.03.01 |
어셈블리 기초(x86) (0) | 2020.03.01 |