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