Я учусь создавать шелл-код и отлично провожу время. Я в основном понимаю, что мне делать. Я могу создать asm-код, который фактически сгенерирует оболочку. Однако я собирался проверить свои способности, попробовав другой системный вызов, а именно cat
.
Я использую метод построения стека из регистров. Однако я столкнулся с проблемой, когда мне нужно передать массив параметру argv. Это достаточно просто при выполнении оболочки, я могу просто передать адрес адреса строки /bin/sh
в стеке. Но с cat
мне нужно передать как имя функции /bin/cat
, так и аргумент для cat
ie /etc/issue
.
Я знаю, что макет для системного вызова:
rax : syscall ID
rdi : arg0
rsi : arg1
rdx : arg2
r10 : arg3
r8 : arg4
r9 : arg5
Я не могу расшифровать, как передать {"cat","/etc/issue"}
в один регистр, а именно в rsi.
Моя сборка:
global _start
section .text
_start:
;third argument
xor rdx,rdx
;second array member
xor rbx,rbx
push rbx ;null terminator for upcoming string
;push string in 2 parts
mov rbx,6374652f ;python '/etc/issue'[::-1].encode().hex()
push rbx
xor rbx,rbx
mov rbx, 0x65757373692f
push rbx
;first array member
xor rcx,rcx ;null terminator for upcoming string
add rcx,0x746163 ;python 'cat'[::-1].encode().hex()
push rcx
;first argument
xor rdi,rdi
push rdi ;null terminator for upcoming string
add rdi,7461632f6e69622f ;python '/bin/cat'[::-1].encode().hex()
push rdi
mov rdi,rsp
;execve syscall
xor rax,rax
add rax,59
;exit call
xor rdi,rdi
xor rax,rax
add rax,60
Она работает, но (как и ожидалось) прерывается, когда в качестве argv передается NULL.
Я даже попытался просто написать приложение C который создает массив, завершает работу и отлаживает его, но я все еще не совсем понимал, что он делал для создания массива.