Opcode 앞에 1바이트 prefix 가 선택적으로 들어갈수 있는데
그중 66H, 67H 의 경우
opcode 뒤의 operand size, address size 를 지정.
16비트 jmp 나 call 을 하려면
67H 를 prefix 로 줘야함.
그렇다고 쳐도 명령 자체는 opcode 뒤에 4바이트를 차지.
67 E8 00 01 xx xx
이런식으로 오게되면 67 명령이 끝나는 지점(6바이트 뒤) 로부터 1바이트 를 더한 목표지로 Call 을 함.
E9 의 경우 JMP 를 함.
여기서 16비트의 2바이트는 little endian 으로 들어가는 signed word임.
그리고 00 00 의 경우 x86 에서
add al (%eax)
로 해석되므로 eax 가 필요없는 상황에서는 00 00 00... 도 NOP sled 역할이 됨.
67H prefix 를 안써주면 E8, E9 뒤의 4바이트 전체를 offset 으로 계산함.
그리고 67H 는 1회성임. 한번 써줬다고 그다음부터 생략가능한게 아니라
16비트 jmp, call 을 할때마다 써줘야함.
따라서 결국 3바이트 jmp, call 이 아니라 4바이트 jmp, call
실질적으로는 6바이트 jmp, call 이나 다름없음...
단지 16비트로 처리될때 뒤의 2바이트가 영향이 없을뿐...
그리고 절대주소 JMP(absolute jmp) 의 경우 0xFF 0x25 ? ? ? ? 이렇게 ff 25 의 2바이트 opcode 를 이용해서 가능하다.
비슷하게 절대주소를 CALL 할 수도 있다.
'Programming' 카테고리의 다른 글
Finding symbol in libc (0) | 2013.07.10 |
---|---|
x86 CR3 register (0) | 2013.07.10 |
FreeBSD system call table (0) | 2013.07.10 |
Kernel module compile example (0) | 2013.07.08 |
python RIJNDAEL encryptor/decryptor (0) | 2013.07.02 |