엄범

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' 카테고리의 다른 글

gdb peda / gdb-multiarch  (0) 2017.07.13
gdb  (0) 2017.07.12
LD_PRELOAD를 이용한 so injection과 hooking. + wrapping function  (2) 2016.12.19
ptrace - Linux injection ( code injection / so injection )  (0) 2016.12.12
jmp, call instruction 주소 계산  (2) 2016.11.15
Anti debugging  (0) 2016.08.31