안잡아모찌 2018. 9. 29. 17:39

레지스터에는 여러 종류가 있다. 레지스터는 Special Memory이고, 모든 레지스터는 4byte를 갖는다.  

대표적인 예로는 ESP,EBP,EAX,EIP ....


<ESP>

Extended Stack Pointer 의 약자로, 현재 스택의 가장 위에 들어있는 데이터를 가리키고 있는 포인터.

데이터가 Push 될 때마다, ESP값은 감소한다.


<EBP>

Extended Base Pointer 의 약자로, 현재 스택의 가장 바닥을 가리키는 포인터.

새로운 함수가 호출될 때마다, EBP값이 지금까지 사용했던 스택의 꼭대기의 위에 위치하게 되고 새로운 Stack이 시작.

즉, EBP는 새로운 함수가 호출이거나 현재 실행중인 함수가 종료되어 리턴될 때마다 값이 달라짐.


<ASM>

push ebp -> 이전 스택의 Base주소를 저장함.

mov ebp,esp -> 현재 스택의 꼭대기를 새로운 스택의 base로 지정(새로운 스택 시작)


<EIP>

Extended Instruction Pointer의 약자로, CPU가 처리할 명령어의 주소를 나타내는 레지스터(32bits)

CPU는 EIP에 저장된 명령어의 주소에서 명령어를 순차적으로 처리하고 길이만큼 EIP를 증가시킨다.


<EAX>

산술연산 명령어에서 상수 , 변수 값의 저장용도로 사용.

일반적으로 함수 리턴값에 사용됨.




<Instruction>

push  x

     esp = esp – 4 ( If execute , 4bytes)

     mem[esp] ß x

esp4만큼 아래로 내려가고 메모리에 x를 저장한다. 위로 갈수록 높은수.


pop  x

     x ß mem[esp]

     esp = esp + 4


mov  reg1, data

     reg1 ß data


and  reg, data

     reg ß reg AND data (2진법 계산을 해주면 된다 16진수를 2진수로 바꿔서)


sub  reg, data

     reg ß reg – data


mov DWORD PTR [addr], data

(esp+0x1c , 0x1e) esp값에 1c를 더한 주소에서부터 시작 1e(0000001e)를 넣음.

4 byte in mem[addr] ß data


call  x

     push return-addr (the address of the instruction after “call x”)

     jump to x


leave

     esp ß ebp

     pop  ebp


ret

     eip ß mem[esp]

     esp = esp + 4  

 

eip : fetch instr at cs:eip àupdate eip àexecute instr à반복