jmp, call instruction 주소 계산
Intel x86 architecture에서 JMP, CALL 명령어는 5Byte로 opcode와 operand는 다음과 같다.
```c
JMP : E9 XX XX XX XX
CALL : E8 XX XX XX XX
```
이 때 operand는 절대주소 값이 아니라, 현 위치 기준 상대주소다.
따라서
```c
XX XX XX XX = 목적지주소 - 현재명령어주소 - 5 ( Little Endian 정렬 )
```
-5(Byte)는 JMP, CALL 명령어의 크기 만큼 빼주는 것.
ex) 402000에서 401000으로 간다면
```c
402000 - 401000 - 5 = FF FF EF FB
E9 FB EF FF FF
```
절대주소를 사용하고 싶은 경우
```c
mov eax, 401000
jmp *eax
```
call도 동일하게 사용하면 된다.
``c jmp == push, ret`` 이기 때문에 이렇게 사용해도 된다.
```
push 401000
ret
```
'Security > Reversing & Dbg' 카테고리의 다른 글
LD_PRELOAD를 이용한 so injection과 hooking. + wrapping function (2) | 2016.12.19 |
---|---|
ptrace - Linux injection ( code injection / so injection ) (0) | 2016.12.12 |
Tools - Reversing, bf tool (0) | 2016.09.25 |
Anti debugging (0) | 2016.08.31 |
IDA (0) | 2016.08.24 |