728x90
레지스터
일단 분석을 하기위해 더 중요한 레지스터들 먼저 정리하겠다.
포인터를 수행하는 레지스터 (스택, 프로그램의 흐름 관리)
RSP(Stack Pointer register) ,ESP
- 현재 스택의 위치를 표기하는 포인터로 사용한다.
RBP(Stack Base Pointer register) ,EBP
- 스택의 베이스를 가리키는 포인터로 사용한다. 쉽게 말하면 스택에서 기본이되는 메모리주소라고 생각하면 좋을듯하다. (프링글스통이 스택쌓이는 공간이라고 하면 선입후출(LIFO : Last-In, First Out)로 스택이 들어갔다 나왔다 하는데 프링글스의 바닥 철판 부분이라고 생각하면 좋대 ㅋㅋ)
RIP(Instruction Pointer) ,EIP
- 다음에 실행될 명령의 메모리주소를 저장한다.
나머지는 추후에 정리해두자..
어셈블리어 (명령어)
PUSH
- 데이터를 스택에다가 넣는다. (스택에다가 저장한다.)
MOV
- 데이터를 한 곳에서 다른 곳으로 복사하는 명령어다. (바꾼다고도 하더라)
- A의 값을 B의 값으로 복사한다. (mov eax, 100 은 eax에 100이라는 값을 넣는다. 다만 구체적인 연산을 포함할 수 없다.)
LEA
- A의 값을 B의 값으로 연산을 포함하여 복사한다.(lea eax, [eax + 1000]은 eax에 1000을 넣은 값은 다시 eax에 삽입한다.)
SUB | ADD
- 빼기 | 더하기
여기서 잠깐! PUSH,MOV,SUB는 어셈블리어에서 프롤로그다. (함수가 시작될 때 실행되는 초기 설정 부분)
JMP
- 프로그램의 실행 흐름을 특정 주소로 무조건 이동시키는 명령어다.
POP
- 스택에서 값을 꺼내 레지스터에 저장하는 명령어다. (스택에서 뺀다.)
CALL
- 함수를 호출하는 명령어다. 함수 호출 후에 돌아올 주소를 스택에 저장한다.
- 함수의 동작을 다 수행하면 RET 명령어를 통해 다시 돌아올 수 있게 된다.
NOP
- 아무 작업도 하지 않는 명령어다. 1byte의 공간을 차지한다. (내가 생각했을 때 NULL값이라고 생각하면 될 듯?)
LEAVE (종료할때)
- 함수 종료를 위하여 현재까지의 메모리 스택을 비우고 RBP를 자신을 호출한 메모리 주소로 채운다.
RET (종료할때)
- 함수에서 반환되는 명령어다. 스택에 저장된 리턴(반환)되는 주소(돌아갈 주소)로 프로그램 동작을 이동시킨다.
728x90