在 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
进行系统调用)。您可以保持原样。这只是一个注释。
我正在学习汇编,我写了这个 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
进行系统调用)。您可以保持原样。这只是一个注释。