Załóżmy chcę zrobić krótki skok stosując następujące opcodes:Jak zakodować względną krótkie JMP w x86
EBCB lub JMP rel8
„skok krótki, RIP = RIP + 8-bitowy znak przesunięcia rozszerzony do 64 bitów "
(gdzie CB to bajt wartość podpisana reprezentująca względem przesunięcia odnoszące się do kierunku, w EIP rejestr)
Może zawsze przesunięcie będzie przesunięcie + 2 ponieważ EIP w czasie wykonywania (kierunek odniesienia) w tym krótkim skoku jest podstawą instrukcja twobyte, ale składnik sumy occurs always
EB 30 = jmp 0x00000032 (+30)
EB e2 = jmp 0xffffffe4 (-30)
, a następnie EIP może być celowo w tym samym kierunku, ponieważ fe + 2 to lub EIP.
eb fe = jmp 0x00000000
Uważam to zaskakujące, że overoffset ocurred rozwidlone choć liczba jest ujemna. Ale w Intelu nie znajduję żadnej wzmianki (może z powodu 3000 stron).
Intel® 64 oraz IA-32 Instrukcja architektury oprogramowania Program: Cz. 2A 3-423
Sytuacja bliska skok gdzie skok zakres jest ograniczony do -128 do +127 od aktualnej wartości EIP.
Potem rozważać trzy możliwości:
- +2 ponieważ jest po/wartość przyszłej z EIP w czasie wykonywania
- Zakodowany wartość nie jest zakodowany składnik 2s podpisana numer.
- ten pojawia się w instrukcji, ale nie widziałem, bo jestem głupi
Jestem zdezorientowany terminologią: czym jest "krótki skok"? Nie byłem w stanie znaleźć definicji tego w Internecie. –
Skrócony skrót @AndersonGreen jest kodowany jako * jmp rel8 * (EB XX), gdzie względna odległość (dest-źródło) jest mniejsza niż 0x80. Drugi nazywa się długim skokiem, który jest zakodowany jako * jmp rel32 * (E9 XXXXXXXX). Zauważ, że można to zakodować za pomocą przedrostka 66H, który zmienia operand na * rel16 *. – JosephH