Ошибка сегментации в коде сборки при использовании немедленных - PullRequest
0 голосов
/ 01 ноября 2018

Итак, я изучил некоторый базовый ассемблерный код, ориентированный на создание шелл-кода, и это все прекрасно и просто, но книга, о которой я все это читаю, немного устарела. До сих пор секция кода сборки работала без сбоев, но я столкнулся с проблемой с некоторым кодом, который открывает новую оболочку.

BITS 32

  jmp short two     ; Jump down to the bottom for the call trick
one:
; int execve(const char *filename, char *const argv [], char *const 
envp[])
  pop ebx           ; ebx has the addr of the string
  xor eax, eax      ; put 0 into eax
  mov [ebx+7], al   ; null terminate the /bin/sh string
  mov [ebx+8], ebx  ; put addr from ebx where the AAAA is
  mov [ebx+12], eax ; put 32-bit null terminator where the BBBB is
  lea ecx, [ebx+8]  ; load the address of [ebx+8] into ecx for argv ptr
  lea edx, [ebx+12] ; edx = ebx + 12, which is the envp ptr
  mov al, 11        ; syscall #11
  int 0x80          ; do it

two:
  call one          ; Use a call to get string address
  db '/bin/sh'     ; the XAAAABBBB bytes aren't needed

Пройдя пару тестовых программ пару раз, мне удалось выяснить, в чем, на мой взгляд, проблема. В первый раз, когда он использует немедленный в программе, [ebx+7] (и, следовательно, теоретически, две другие команды mov), возникает ошибка сегментации. Я просто не могу понять почему. Системный вызов, который я пытаюсь сделать (если комментарии не так хороши в контексте) - execve, который принимает имя файла, указатель на массив аргументов и переменные envp. Возможно ли то, что этот код пытается сделать вообще возможным, и если нет, то как я могу добиться того же эффекта?

Книга, если вам интересно, называется "Взлом: искусство эксплуатации, 2-е издание", и она была написана в 2008 году, как я уже сказал, датирована.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...