본문 바로가기

리버싱

[리버싱] CALL, JMP, RET (RETN) 명령어




CALL (Call a Procedure)


함수 호출 시 사용된다. JMP  명령어와 같이 프로그램의 실행 흐름이 변경되지만 JMP 명령어와 다른 점은 되돌아올 리턴 어드레스 (CALL 다음 명령) 를 스택에 저장한다는 것이다. 되돌아올 주소를 저장하기 때문에 함수 호출 후 원래 위치로 실행 흐름을 되돌릴 수 있다.


EIP에는 서브루틴의 주소가 들어가서 CALL 호출을 하면 EIP에 저장된 서브루틴으로 가서 실행 후 RET 명령을 통해 스택에 저장된 리턴 어드레스를 EIP에 넣고 EIP에 있는 주소로 돌아간다. 






JMP (Jump Unconditionally to Label)


오퍼랜드가 가리키는 곳으로 이동시키는 명령으로 실행 흐름이 변경된다. 되돌아올 리턴 어드레스 값을 저장하지 않기 때문에 EIP에는 오퍼랜드가 가리키는 곳의 주소가 들어간다.



옵션에는 short (127byte 범위 내에서 점프), near (같은 세그먼트 내에서 점프), far (현재 세그먼트를 벗어남) 3가지가 있다.


operand 에는 label, 레지스터, 메모리 값이 올 수 있다






RET (Return Address)


CALL 함수를 통해 호출된 함수에서 다시 복귀하기 위해 사용하는 명령어이다. ESP 레지스터가 가리키는 값을 EIP 레지스터에 저장한다. 복귀주소를 기억하고 그 주소로 점프하는 것이다. 문법적으로는 올바른 표현이 아니지만 의미상으로 POP EIP라고 보면 된다.