2009-04-21 2 views
6

Как назначение для класса безопасности, я пытаюсь использовать __asm__("jmp 0xbffff994"); в своем коде, но когда я разбираю вещи в gdb, инструкция изменяется на jmp 0xc8047e2a. Любая идея, почему и как я могу перейти к конкретному адресу?x86 перейти к адресу

+2

Почему вам нужно перейти к необработанному адресу? Я с трудом понимаю любое возможное (не гнусное) использование для этого. – kquinn

+0

Какую систему вы используете? –

+5

@kquinn, независимо от того, задан вопрос, давайте попробуем ответить на него. – samoz

ответ

18

Возможно, потому что это переход к относительному адресу, а компоновщик или загрузчик переместили ваш код. Попробуйте поместить адрес в переменную, а затем сделать:

jmp dword [var] 

или в качестве альтернативы:

push 0xbffff994 
ret 
+5

* это * правильный ответ, также обратите внимание, что: «mov eax, 0x11223344; jmp eax»; также будет работать и, скорее всего, будет самым прямым. –

+1

очень верно, но он может использовать fastcall (я не уверен в значении 0xbffff994). – Mark

+0

Комбинация PUSH RET работает! Спасибо! – Martin

0

Daniel объясняет, почему ваш прыжок не тот, который вы запрограммировали. Он связан с объектными файлами и связыванием.

Если вы хотите перейти на конкретный адрес, лучше всего исправить прыжок с помощью отладчика или дизассемблера.

0

В моей системе (GCC версии 4.2.4, Ubuntu), это выглядит хорошо на disassmbley (инсайт) :

 
int main() 
{ 
asm("jmp 0xbffff994"); 
return 0; 
};  

результаты disassmbley (проницательность):

 
     0x8048344  :     lea 0x4(%esp),%ecx 
-  0x8048348  :    and $0xfffffff0,%esp 
-  0x804834b  :    pushl -0x4(%ecx) 
-  0x804834e  :    push %ebp 
-  0x804834f  :    mov %esp,%ebp 
-  0x8048351  :    push %ecx 
-  0x8048352  :    jmp 0xbffff994 
-  0x8048357  :    mov $0x0,%eax 
-  0x804835c  :    pop %ecx 
-  0x804835d  :    pop %ebp 
-  0x804835e  :    lea -0x4(%ecx),%esp 
-  0x8048361  :    ret 
+0

Я бы предположил, что этот дизассемблер показывает смещение jmp, а не его фактическую цель. (команда jmp принимает смещение относительно eip, когда вы даете ему 32-битный непосредственный операнд). –

+0

Почему вы догадались? есть ли способ проверить это? он работает как графический интерфейс с GDB ниже. –

+0

Или могло случиться так, что переезда нет. Однако, если вы сбрасываете коды операций с помощью сборки, вы сможете увидеть смещение. – Mark

0

Трудно определить точный адрес во время компиляции, вы пробовали использовать ярлыки? Гораздо чаще их использовать с jmp.

пример:

start: 
jmp exit 

exit: 
ret 
0

Я бы рекомендовал использовать шестнадцатеричный редактор и просто изменив значение, если это только один раз вещь.

Смежные вопросы