在shellcode中使用syscall

时间:2018-10-01 18:32:44

标签: assembly x86-64 shellcode

我正在学习汇编语言,我编写了此shellcode,该shellcode可以在firefox上打开Goog​​le主页。但是,它什么也没做(甚至由于添加了我不理解的指令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 :(得分: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)。您可以保持原样。这只是一个音符。