В настоящее время я пытаюсь отточить свои навыки чтения ассемблера в GDB, и я столкнулся с некоторыми странностями при попытке прочитать символ в GDB, и я не уверен, что происходит.

Для некоторого контекста файл, который я просматриваю, скомпилирован, функции .c нет, хотя код был скомпилирован в c. По сути, это файл назначения «бомбы», в котором требуются определенные входные данные для перехода к следующему разделу кода, и этот код возникает в результате тестирования одного из входов на предмет того, каким должен быть ответ.

Код, содержащий символ, который я пытаюсь прочитать, выглядит следующим образом:

cmp -0x1(%rbp),%al
je 0x400acf <nextpartofcode>

Я пытаюсь прочитать -0x1 (% rbp), поэтому я ввел print/c $rbp-1, чтобы попытаться посмотреть на него, и GDB напечатал: 175 '\257'. Предполагая, что этот вывод означает, что сравнение будет успешным, если ввести символ ASCII 175, однако, когда я ввел символ (он выглядит как >>), он был показан как -62 '\302'.

Я также попытался прочитать значение как целое, восьмеричное, десятичное, строковое и шестнадцатеричное значение с тем же успехом, и я не понимаю, что еще я могу попробовать. Что именно здесь происходит? Я ищу не в том месте (т.е. -0x1 (% rbp) не $ rbp-1)? Считаю ли я значение чем-то, чем оно не является (мне сказали, что это должен быть символ, но это что-то еще)? Стоит ли искать ценность в другом месте? Я застрял и был бы признателен за любое руководство.

1
M. Lab 9 Ноя 2018 в 04:31

1 ответ

Лучший ответ

$rbp-1 - это адрес; вам нужно разыменовать его. (Используйте команду GDB x, чтобы исследовать память по адресу, или используйте синтаксис C для разыменования указателя на print, например p /c *(char*)($rbp-1).

Вы печатали младший байт адреса в виде символа.

2
Peter Cordes 9 Ноя 2018 в 01:42