본문 바로가기

Programming

x86 assembly 16bit prefix

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