Как проанализировать косвенный скачок в ассемблерном коде - PullRequest
0 голосов
/ 15 ноября 2018

Я новичок в Си и ассемблере, который сейчас работает над проектом сборки.Тем не менее, я столкнулся с некоторой проблемой с инструкцией косвенного перехода.

Строка инструкции jmp:

4006a6: ff 24 c5 50 08 40 00    jmpq   *0x400850(,%rax,8)

Когда я перехожу к 400850, строка:

400850: ad                      lods   %ds:(%rsi),%eax
400851: 06                      (bad)  
400852: 40 00 00                add    %al,(%rax)
400855: 00 00                   add    %al,(%rax)
400857: 00 b3 06 40 00 00       add    %dh,0x4006(%rbx)
40085d: 00 00                   add    %al,(%rax)
40085f: 00 bc 06 40 00 00 00    add    %bh,0x40(%rsi,%rax,1)

Основываясь на том, что я узнал, я должен посмотреть на адрес, который хранится в 400850 + 8 * rax, и перейти к этому адресу, чтобы увидеть инструкцию и выполнить определенную операцию.Например, если rax = 1, я должен посмотреть на адрес, хранящийся в 400858, но я не могу найти 400858, и я также не знаю, что означает значение, такое как «ab», это адрес?

Кстати, я полагаю, что этот косвенный скачок представляет собой условие переключения в коде C.

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Этот адрес 0x400850 является таблицей указателей, поэтому он выглядит примерно так: 400850: 00000000004006ad 400858: 00000000004006b3 400860: 00000000004006bc

rax is и index для таблицы указателей.вам нужно знать индекс и найти адрес перехода из таблицы.

0 голосов
/ 15 ноября 2018

jmpq *0x400850(,%rax,8) является косвенной jmp индексацией в таблице целей прыжка.Да, это, вероятно, генерируется компилятором из оператора switch.


Вы использовали objdump -D вместо objdump -s, поэтому выходные данные разбивают hexdump на куски в соответствии с бессмысленным декодированием как x86-64 инструкции, а не в адресах qword.

Формат

starting   machine code            disassembly
address    hex byte(s)             (AT&T syntax)

400850:    ad                      lods   %ds:(%rsi),%eax

Байт (ы) в одной строке идут с инструкцией.lods является однобайтовой инструкцией с кодом операции 0xad, поэтому младший байт qword в 0x400850 равен 0xad

Все, что есть в hexdump, но не каждый 8-байтовый блок имеетпронумерованный ярлыкКаждый байт имеет свой собственный адрес;вам просто нужно сосчитать с предыдущего отмеченного адреса, чтобы найти начало нужного вам фрагмента данных.


Или используйте objdump -s, как рекомендовано в сборке jmp, до строки, которая не '* существует 1025 *, чтобы получить простой шестнадцатеричный дамп каждой секции ELF, разбитый на куски одинакового размера.

Или изнутри GDB, команда x.

...