Вы забыли выполнить один шаг, чтобы увидеть выполнение инструкции cmpxchg esp, eax
. Выполнение шло намного дальше, пока не случилось, что он набрал опкод f1
.
Используйте starti
, чтобы начать с первой инструкции в пользовательском пространстве, затем si
.
Обычно ваш процесс будет зависать, если вы позволите выполнению попасть в набор 00 00
байтов, потому что он декодируется как add [eax], al
и EAX = 0 в начале Linux stati c исполняемого файла. (Вы не удосужились сделать системный вызов _exit
со своего _start
.)
Но cmpxchg esp, eax
устанавливает EAX в качестве допустимого указателя. (Неявный операнд EAX изначально не был равен ESP, поэтому происходит « очистка ZF и загрузка r / m32 в EAX ». Тот факт, что EAX был задан как явный исходный операнд, не имеет значения, кстати.)
Выполнение продолжается с помощью набора 00
инструкций, которые декодируются как 00 00
add. Затем он попадает в показанный вами блок, где первой ошибочной инструкцией оказывается байт f1
, который находился там в исполняемом файле где-то после конца раздела .text
.
Конечно cmpxchg
не выполняется как icebp
/ int1
. И ваша разборка даже невозможна, если вы были на самом деле по инструкции cmpxchg. Длина cmpxchg
составляет 3 байта, но расстояние между адресами для смежных инструкций составляет всего 1 байт. Так что, возможно, GDB не расшифровывает его.