我正在学习汇编语言,我编写了此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;
}`
答案 0 :(得分:2)
您错过了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和换行符阻止的字符串输入的手段。如果您只是在自己的C代码中调用它,则可以使用push 0
而不是push rax
,而忘记了顶行xor
(对于系统调用使用mov rax, 0x3b
)。您可以保持原样。这只是一个音符。