Как в качестве альтернативы вы можете:
1) показать память с инструкциями по сборке с
di
с явными аргументами
, если вам нужнопротянуть дальше
di -c 1000 ;
если вам нужно разобрать определенный адрес
di -s <address>
2) установить точку останова памяти с помощью
br s -a <memory address you found in previous step>
Другойальтернатива немного более разрушительна, но на самом деле более легка, что может или не может быть полезным в вашем случае. Вы можете сделать недопустимый системный вызов в коде сборки. Ваша программа успешно продолжит выполнение, но lldb
прекратит выполнение следующей инструкции после системного вызова с SIGSYS
/ EXC_SYSCALL
. Вы не указали, нацеливаетесь ли вы на x86-64 или на руку, поэтому настройка будет немного отличаться.
Для x86-64 у вас будет
syscall
Предполагая, что ваш регистр rax
не является действительным системным вызовом, т.е. в диапазоне 0x2000xxx
деструктивная часть будет включать в себя:
1) Обнуление старших 32 битов rax
регистра
2) r11
станет rflags
3) rcx
станет rip
(используется ядром XNU для возврата в пространство пользователя из syscall
), однако если вы сделаете один шаг rcx
станет rsp
, как я упомянул здесь
Для 32 бит и 64 бит выможет сделать системный вызов с:
svc 0x80
Кстати, любой 1-байтовый номер ^ будет работать, но по соглашению это 0x80
. 32bit использует r12
для номера системного вызова. 64bit использует x16
. Подробнее здесь & здесь . Так что в основном допустимые диапазоны составляют 0x0
- 0x0xxx
. Кажется, что даже недействительные системные вызовы влияют на x0
& x1
(для 64-битных, так как у меня нет 32-битных устройств для тестирования). Так что, если вы примете во внимание x0
& x1
, затронутые после системного вызова, и у вас будет x16
, который является недопустимым системным вызовом, вы можете идти.
ОБНОВЛЕНИЕ Для @PeterCordes отличное замечание еще Еще одна альтернатива для x86:
int3
т.е. отладочная ловушка
эквивалент руки равен
trap
Разница в подходе против syscall
заключается в выполнении программы после того, как int3
/ trap
продолжит тогда и только тогда, когда присоединен отладчик и после команды lldb continue
добавленозначение это никак не повлияет на регистры . При использовании системного вызова программа также продолжит выполнение без отладчика, к которому подключены вышеупомянутые затронутые регистры.