레지스터 | 어셈블리어

FR33CHICKEN ㅣ 2024. 9. 6. 01:32

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