【发布时间】:2018-10-01 18:32:44
【问题描述】:
我正在学习汇编,我编写了这个 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;
}`
【问题讨论】:
-
你确定推送是正确的吗?就我而言,amd64 程序集中没有
push imm64。 -
add %al,(%rax)是00 00的解码方式。这意味着执行超出了您的代码进入填充。这也意味着您没有使用 GDB 的set disassembly-flavor intel来匹配您的 NASM 代码。顺便说一句,@fuz 是正确的,没有push imm64。这段代码注定要失败;您应该从 NASM 收到关于截断值太大而无法容纳的警告:How to push a 64bit int in NASM? -
你是对的,我改变了代码通过一个寄存器来完成所有的“推送”