메모리 구조를 기억해두어야할 필요가 있다.
스택, 라이브러리영역, 힙, 데이타 등등 상세한 영역이 있다.
함수의 프롤로그와 에필로그는 스택, 정확히 스택프레임에 관여를 하는 작업이다.
프롤로그는 함수가 호출(Call) 될 때, 스택프레임을 구성해주는 작업까지를 일컫는다.
스택프레임(Stack Frame)은 말그대로 스택의 틀이다. 틀.
프롤로그 과정을 그림으로 보면 이해가 편하다.
번호는 작업이 실행되는 순서인데 RET(복귀주소) 부터 스택 밑(메모리 가장높은주소)에 넣고 SFP는 그 위에(메모리 주소는 RET메모리 주소보다 낮음) 넣고 sfp밑부분에 ebp를 설정해두고 esp값에 ebp주소 값을 넣는 것까지가 프롤로그의 한 과정이다.
이제 함수가 안에서 변수도 불러오고 다른 함수도 호출시키고 하면 esp가 위,아래로 왔다갔다 할 것이다. 그러다가 함수가 마무리 될 때쯤에 에필로그 작업이 시작되는데
에필로그는 어셈블리 명령으로 leave 와 ret으로 구성되어 있다. (스택프레임이 사라지는 과정이기에 따로 그림은 없다.)
leave는
mov %ebp %esp
pop %ebp
의 두개의 어셈블리어로 구성되어있는데 mov %ebp %esp 는 esp레지스터에 ebp주소를 넣음으로써 ebp와 esp를 동일 시 시키는 것(esp는 유동적이라고 바로 윗줄에서 말했으므로 이런 작업이 왜 필요하고 유효한지는 이해할 수 있을 것이다)이다. 프롤로그의 3번 상태가 되는 셈이다. pop %ebp는 ebp를 스택프레임에서 꺼내는 것이다. 그러면 프롤로그에서 1번 상태가 되어있을 것이다.
ret는
pop %eip
jmp %eip
의 두개의 어셈블리어로 구성되어있는데 pop %eip는 eip레지스터(프로그램에서 다음 명령줄을 가리킨다)를 스택에서 꺼낸다는 것이다. jmp %eip는 다음명령의 주소로 점프한다는 뜻이고....
나중에 디버깅하다보면 프로그램에서 100%의 확률로 있으며 ret같은 경우는 해킹기법에서 자주 사용되니 ret에서도 상세한 명령어 숙지는 기본!
'<보안 study> > 시스템' 카테고리의 다른 글
Win-AFL 퍼저 빌드과정 (1) | 2022.08.11 |
---|---|
[PoC] log4shell(CVE-2021-44228) (0) | 2021.12.12 |
[CodeGate_OpenCTF] csurself (0) | 2019.03.29 |
RTL기법이란? (Return To Library) (0) | 2018.07.26 |
[linux]리눅스 명령어 (0) | 2018.07.24 |