我尝试用syscall
创建shell代码void main()
{
__asm__ __volatile__
(
"movq $0x0068732f6e69622f, %rdx \n\t"
"pushq %rdx \n\t"
"movq $0x3b, %rax \n\t"
"movq %rsp, %rdi \n\t"
"movq %rsp, %rdx \n\t"
"pushq %rdi \n\t"
"lea 0x0(%rsp), %rsi \n\t"
"movq $0x2a, %r10 \n\t"
"movq $0x2, %r8 \n\t"
"movq $0x6, %r9 \n\t"
"syscall \n\t"
"pop %rdi \n\t"
"pop %rdx \n\t"
);
}
这是我的来源
编译成功。
但它没有执行我瞄准的sh功能
代码是否有任何问题???
答案 0 :(得分:0)
试试这个,取自here并稍稍煽动起来。
void main()
{
__asm__ __volatile__
(
"xor %rdi,%rdi \n\t"
"push %rdi \n\t"
"push %rdi \n\t"
"pop %rsi \n\t"
"pop %rdx \n\t"
"movq $0x68732f6e69622f2f,%rdi \n\t"
"shr $0x08,%rdi \n\t"
"push %rdi \n\t"
"push %rsp \n\t"
"pop %rdi \n\t"
"push $0x3b \n\t"
"pop %rax \n\t"
"syscall \n\t"
);
}
您的汇编程序类似,但似乎在$ rdi和$ rdx加载时出错。工作代码在系统调用之前将它们设置为NULL(0)。这个link表示exec调用有三个参数,显然后两个参数可以为空。
我使用您的代码完成了设置并且它有效!
void main()
{
__asm__ __volatile__
(
"movq $0x0068732f6e69622f, %rdx \n\t"
"pushq %rdx \n\t"
"movq $0x3b, %rax \n\t"
"movq %rsp, %rdi \n\t"
"movq %rsp, %rdx \n\t"
"pushq %rdi \n\t"
"lea 0x0(%rsp), %rsi \n\t"
"movq $0x2a, %r10 \n\t"
"movq $0x2, %r8 \n\t"
"movq $0x6, %r9 \n\t"
"movq $0x0, %rsi \n\t"
"movq $0x0, %rdx \n\t"
"syscall \n\t"
"pop %rdi \n\t"
"pop %rdx \n\t"
);
}
有趣的小谜题,让我有机会刷新我的汇编程序:)