mov sql вызывает вызов в дамп ядра - PullRequest
2 голосов
/ 22 января 2020

Исходя из файла ядра, сначала использовалась команда where, а затем команда disassemble.

(gdb) disassemble
Dump of assembler code for function prm_get_sta:
   0x0000000000414b80 <+0>:     push   %rbp
   0x0000000000414b81 <+1>:     mov    %rsi,%rbp
   0x0000000000414b84 <+4>:     push   %rbx
   0x0000000000414b85 <+5>:     mov    %rdi,%rbx
   0x0000000000414b88 <+8>:     sub    $0x18,%rsp
   0x0000000000414b8c <+12>:    movabs 0x6a53e8,%rax
   0x0000000000414b96 <+22>:    test   %rax,%rax
   0x0000000000414b99 <+25>:    je     0x414c90 <prm_get_sta+272>
   0x0000000000414b9f <+31>:    mov    0x80(%rax),%edx
   0x0000000000414ba5 <+37>:    test   %edx,%edx
   0x0000000000414ba7 <+39>:    jne    0x414c90 <prm_get_sta+272>
   0x0000000000414bad <+45>:    mov    0x8(%rbx),%edx
   0x0000000000414bb0 <+48>:    mov    0x18(%rbx),%rax
   0x0000000000414bb4 <+52>:    add    (%rbx),%rdx
   0x0000000000414bb7 <+55>:    cmp    %rdx,%rax
   0x0000000000414bba <+58>:    je     0x414ce6 <prm_get_sta+358>
   0x0000000000414bc0 <+64>:    mov    %rax,0x0(%rbp)
   0x0000000000414bc4 <+68>:    movswq (%rax),%rdx
   0x0000000000414bc8 <+72>:    movabs $0x6a2900,%rcx
=> 0x0000000000414bd2 <+82>:    movslq (%rcx,%rdx,8),%rdx
   0x0000000000414bd6 <+86>:    add    0x18(%rbx),%rdx
   0x0000000000414bda <+90>:    mov    %rdx,0x8(%rbp)

Далее были выполнены информационные регистры.

(gdb) info registers
rax            0x1672fa0        23539616
rbx            0x7fff6ec02f40   140735051476800
rcx            0x6a2900         6957312                 <----------------Hex to Decimal value
rdx            0xffffffffffffcccd       -13107          <----------------Hex to Decimal value 
rsi            0x7fff6ec01060   140735051468896
rdi            0x7fff6ec02f40   140735051476800
rbp            0x7fff6ec01060   0x7fff6ec01060
rsp            0x7fff6ec01000   0x7fff6ec01000
r8             0x7fff6ec02588   140735051474312
r9             0x111    273
r10            0x0      0
r11            0x2abd31653c50   46992065903696
r12            0x414b80 4279168
r13            0x7fff6ec02b00   140735051475712
r14            0x414440 4277312
r15            0x0      0
rip            0x414bd2 0x414bd2 <prm_get_sta+82>
eflags         0x10297  [ CF PF AF SF IF RF ]
cs             0x33     51
ss             0x2b     43
ds             0x0      0
es             0x0      0
fs             0x0      0

Исследование: Команда movslq предположительно выполняет расширение знака дополнения до 32-> 64-битного 2, расширяясь путем копирования знакового бита источника на все новые верхние биты

Документация была найдена в связи с уникальным использованием данных в скобках: (% rcx,% rdx, 8), что объясняет это так:

( % rcx,% rdx, 8) Содержимое памяти, хранящейся по адресу,% rcx + 8 % rdx *

Если правильно следовать логике c, я интерпретировал это как следующее используя вышеуказанные данные реестра ...

(6957312 + 8 * -13107)

Используя порядок операций, сначала выполняется (8 * -13107), что приводит к: -104,856 затем добавил 6957312, что составляет 6 852 456 и достаточно малое число.

Значение -104 856 приводит к получению целых 8 байтов и задается вопросом, может ли там быть проблема.

Вопросы:

1 - верно ли это предположение о том, что происходит (6957312 + (8 * -13107))?

2 - Что цель умножения на 8?

3 - Есть ли что-то очевидное, что могло бы вызвать ядро?

1 Ответ

2 голосов
/ 23 января 2020

Инструкция обращается к неверному адресу памяти , и причина, по-видимому, в отрицательном индексе массива .

Как вы упоминаете, (%rcx, %rdx, 8) обращается к памяти хранится по адресу %rcx + 8*%rdx.

Другими словами, мы загружаем элемент из 8-байтового элемента массива, начиная с rcx с индексом rdx.

В вашем случае rcx - это 0x6a2900 (вероятно, переменная в разделе данных, попробуйте info symbol 0x6a2900), а rdx - это -13107 - отрицательное число. Индексирование массивов с отрицательными индексами редко происходит в реальных программах, поэтому вам нужно взглянуть на источник функции и попытаться понять, как это могло произойти.

...