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

Я изучаю ассемблер и написал этот шеллкод, который должен открыть главную страницу Google на firefox.Однако он ничего не делает (и даже завершает работу с ошибками в конце из-за добавленной инструкции add %al,(%rax), которую я не понимаю), я делаю все правильно?Я даже не уверен, что правильно закодировал строки.Спасибо!

global _start

_start:
xor rax, rax
push rax

;https:////www.google.com
push 0x6d6f632e656c676f
push 0x6f672e7777772f2f
push 0x2f2f3a7370747468

mov rcx, rsp

push 0x786f66657269662f ; /firefox
push 0x6e69622f7273752f ; /usr/bin

mov rdi, rsp

push rax
push    rcx
push    rdi
mov     rsi, rsp

; execve
mov     al, 0x3b
syscall

Я проверяю свой код с:

char code[] = \x48\x31\xc0\x50\x68\x6f\x67\x6c\x65\x68\x2f\x2f\x77\x77\x68\x68\x74\x74\x70\x48\x89\xe1\x68\x2f\x66\x69\x72\x68\x2f\x75\x73\x72\x48\x89\xe7\x50\x51\x57\x48\x89\xe6\xb0\x3b\x0f\x05
int main(int argc, char **argv){
   (*(void(*)()) code)();
   return 0;
}`

1 Ответ

0 голосов
/ 01 октября 2018

Вы пропустили нулевой терминатор в пути firefox.Добавьте push rax перед гексом firefox точно так же, как вы это сделали с google.com.

. Кроме того, чтобы избежать сбоя из-за отсутствия переменной envp (то есть случайногоrdx), добавьте эту строку при построении rsi

...
push    rax
mov     rdx, rsp # Add this to set rdx = [null]
push    rcx
...

Это передает пустой массив в envp через регистр rdx.

Наконец: обычно push rax - это хак, чтобы пройти через блокированные строки ввода null и newline.Если вы просто вызываете его в своем собственном коде c, вы можете использовать push 0 вместо push rax и забыть верхнюю строку xor (используя mov rax, 0x3b для системного вызова).Вы можете оставить все как есть.Это была просто записка.

...