Ошибка сегментации из-за замены инструкции другой, которая выполняет ту же работу. Почему?

#linux #assembly #x86 #nasm

#linux #сборка #x86 #nasm

Вопрос:

У меня есть этот рабочий шелл-код, который порождает оболочку, я должен изменить его так, чтобы скрыть «/ bin / sh» или «sh», появляющиеся в любом месте двоичного файла после компиляции. Поэтому я подумал о том, чтобы взять шестнадцатеричное значение /bin/sh(2f 62 69 6e 2f 73 68), добавив к нему некоторое случайное значение, скажем, 0x11111, и переместить это значение в регистр, вычесть 0x11111 во время выполнения, а затем поместить это значение, сгенерированное во время выполнения (которое становится /bin/sh), встек и выполнение execv, но я получаю ошибку сегментации на самом 1-м шаге. и я не могу понять, почему?

Приведенный ниже код работает нормально.

 section .data

section .text
    global _start
_start:

xor eax,eax
cdq
push eax
push long 0x68732f2f
push long 0x6e69622f
mov ebx,esp
push eax
push ebx
mov ecx,esp
mov al,0xb
xor edx,edx
int 0x80
  

Но это изменение вызывает ошибку сегментации

 section .data

section .text
    global _start
_start:

xor eax,eax
cdq
push eax
mov ecx,0x11111
mov ebx,0x68744040
sub ebx,ecx
push long eax
push long 0x6e69622f
mov ebx,esp
push eax
push ebx
mov ecx,esp
mov al,0xb
xor edx,edx
int 0x80
  

Пожалуйста, помогите мне в этом. Будет здорово. Спасибо

Ответ №1:

Код отличается, не так ли? Посмотрите здесь:

 sub ebx,ecx
push long eax
  

Вы вычисляете ebx-ecx , но нажимаете eax . И eax равно нулю.

Это должно быть:

 sub ebx,ecx
push long ebx
  

Комментарии:

1. Спасибо, Эл Кепп. Я думал, что результат всегда поступает в eax, поскольку это аккумулятор