어셈블리 핸드레이 및 함수 구조
어셈블리 핸드레이란?
어셈블리 핸드레이(assembly handray)는 어셈블리어를 C언어로 복원시키는 작업을 의미한다.
일반적으로 바이너리를 디버거로 디컴파일을 하면 바이너리에 대한 어셈블리 코드를 볼 수 있다. 이때 이 어셈블리 코드는 숙련자가 아니고서는 명시적으로 의미를 알아보기 힘들다. 그러므로 어셈블리 핸드레이 실습 통해 프로그램의 구조에 대해 자세히 배울 수 있다.
함수 프롤로그란?
어셈블리 코드에서 함수 프롤로그란 함수가 호출될 때 그 함수의 영역을 설정하는 일련의 어셈블리 코드를 뜻한다.
아래의 명령어와 같은 구조로 이루어져 있다.
push ebp // 이때 push 되는 ebp는 함수가 호출되기 전 함수의 ebp다.
mov ebp, esp // 전 함수의 stack pointer을 현재 함수의 base pointer로 저장한다.
함수 에필로그란?
어셈블리 코드에서 함수 에필로그란 함수의 동작이 끝나고 return될 때 나를 호출한 함수로 돌아갈 때 스택을 정리하는 과정이다. 아래와 같이 이루어져 있다.
leave
ret
leave 어셈블리 코드
아래는 leave 어셈블리어가 동작하는 어셈블리 코드다.
mov esp, ebp // 스택 포인터를 현재 베이스 포인터로 설정한다.
pop ebp // 나를 호출하기전 함수의 베이프 포인터를 pop 하고 ebp 레지스터에 저장한다.
ret 어셈블리 코드
아래는 ret 어셈블리어가 동작하는 어셈블리 코드다.
pop eip // eip에 나를 호출했던 전 함수의 위치를 넣는다.
jmp eip // 현재 실행 순서를 변경하여 eip로 설정한다.