Почему инструкция syscall не выполняется?
0x7fffffffeef8: xor %rsi,%rsi
0x7fffffffeefb: xor %rax,%rax <- now rax is 0
0x7fffffffeefe: movabs $0xff978cd091969dd1,%rbx <- rbx='/bin/dash'
0x7fffffffef08: neg %rbx
0x7fffffffef0b: push %rbx
0x7fffffffef0c: push %rsp
0x7fffffffef0d: pop %rdi <- rdi is string
0x7fffffffef0e: mov $0x3b,%al
0x7fffffffef10: syscall
(gdb) stepi
0x00007fffffffef08 in ?? ()
(gdb) stepi
0x00007fffffffef0b in ?? ()
(gdb) stepi
0x00007fffffffef0c in ?? ()
(gdb) stepi
0x00007fffffffef0d in ?? ()
(gdb) stepi
0x00007fffffffef0e in ?? ()
(gdb) stepi
0x00007fffffffef10 in ?? ()
(gdb) stepi
0x00007fffffffef12 in ?? ()
В 0x7fffffffef10
инструкция syscall существует. Но когда я использую команду stepi в GDB, я никогда не выполняю /bin/dash
, Я думаю, что эта сборка должна выполнить /bin/dash
, Я неправильно понял?
Я загрузил полный код сборки. Я изменился xor %eax, %eax
в xor %rax, %rax
я добавил xor %rdx, %rdx
в коде сборки. Но я не могу получить ожидаемые результаты.
process 1993 is executing new program: /bin/dash
[Inferior 1 (process 1993) exited normally]
(gdb)
Результат такой, но я хотел $
вместо (gdb)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main(void)
{
char str[256];
printf("Type sentence.\n");
gets(str);
printf("%s\n", str);
}
Выше программа, код оболочки которой был вставлен.
Я использую Linux 16.04, архитектура x64
1 ответ
Защита памяти - довольно сложная тема, но предпосылка состоит в том, чтобы изолировать код от данных и один процесс от другого. Там действительно нет логической причины, чтобы получить ошибку @ 7fffffffef08
так как neg %rbx - совершенно законная инструкция. Даже попытка выполнить код по этому адресу возможна, но в этом случае эта область памяти отображается как стек. Таким образом, исполняемый бит для этого региона не был установлен, и поэтому вы получаете 0x7fffffffef08 in ?? ()
,
Но в другой программе эти ассемблерные коды выполняются правильно.
заставляет меня поверить, что вы сделали что-то для чтения кода в этой области, логически думая, что это будет работать, но это не так.