在 shellcode 中使用系统调用

syscall use in shellcode

我正在学习汇编,我写了这个 shellcode,它应该在 firefox 上打开 Google 主页。但是它什么也没做(甚至最后因为添加了一条我不明白的指令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;
}`

您在 firefox 路径上遗漏了一个空终止符。在 firefox 十六进制之前添加一个 push rax 就像您对 google.com.

所做的那样

此外,为确保您不会因缺少 envp 变量(即随机 rdx)而崩溃,请在构造 rsi[= 时添加此行25=]

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

这通过 rdx 寄存器将一个空数组传递给 envp

最后:通常 push rax 是一种破解 null 和换行符阻止的字符串输入的技巧。如果您只是在自己的 c 代码中调用它,则可以使用 push 0 而不是 push rax 并忘记第一行 xor (使用 mov rax, 0x3b 进行系统调用)。您可以保持原样。这只是一个注释。