х86 перейти на адрес - PullRequest
       28

х86 перейти на адрес

7 голосов
/ 22 апреля 2009

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

Ответы [ 5 ]

23 голосов
/ 22 апреля 2009

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

jmp dword [var]

или альтернативно:

push 0xbffff994
ret
0 голосов
/ 22 апреля 2009

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

0 голосов
/ 22 апреля 2009

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

пример:

start:
 jmp exit

exit:
 ret
0 голосов
/ 22 апреля 2009

В моей системе (gcc версии 4.2.4, Ubuntu) это выглядит нормально на дисассембли (понимание):

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

Результаты рассогласования (проницательность):

        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 голосов
/ 22 апреля 2009

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

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

...