Подтвердить что ты не робот

Отображаемое значение, найденное по заданному адресу gdb

Я отлаживаю двоичный файл в gdb. Это был код C, составленный gcc на Intel IA-32. Я получил этот результат от objdump. Меня больше всего интересует последняя строка:

08048d9e <func_1>
8048d9e:    55                      push   %ebp
8048d9f:    89 e5                   mov    %esp,%ebp
8048da1:    83 ec 18                sub    $0x18,%esp
8048da4:    c7 44 24 04 88 99 04    movl   $0x8049988,0x4(%esp)
8048dab:    08 
8048dac:    8b 45 08                mov    0x8(%ebp),%eax
8048daf:    89 04 24                mov    %eax,(%esp)
8048db2:    e8 54 01 00 00          call   8048f0b <strings_not_equal>

Я верю, что эта последняя строка сравнит значение, найденное по указанному адресу: 8048f0b. Я пытаюсь:

(gdb) x 0x8048f0b

и получите:

0x8048f0b <strings_not_equal>:  0x57e58955

Я неправильно интерпретирую сборку? Это правильный способ прочитать значение адреса в gdb? Я как бы ожидал найти более полезную шестнадцатеричную ценность ascii. Мне интересно найти сохраненное строковое значение, которое сравнивается с.

Также у вас есть любимый инструмент gui, который вы хотите использовать для такого типа отладки? Я думал о попытке ddd. Я хочу найти более простой способ отладки.

4b9b3361

Ответ 1

Вы правильно читаете значение по адресу памяти 0x8048f0b, но строка call 8048f0b <strings_not_equal> указывает, что этот адрес является началом функции (называемой strings_not_equal()). Вы не ожидали, что это будет ASCII - вы ожидаете, что это будет больше машинного кода.

Если вы ищете аргументы функции strings_not_equal(), они вставляются в стек. Первый аргумент копируется из 0x8(%ebp), который является первым аргументом func1(). Второй аргумент $0x8049988, который предположительно является адресом строки.

Если вы хотите напечатать содержимое адреса в виде строки, вы можете сделать это с помощью x/s:

x/s 0x8049988