繁体   English   中英

为什么不打印?

[英]Why it didn't print?

ptint的简单asm字符串“ / bin / sh”,然后退出

    global _start:
_start:
    jmp what
are:
    mov rbx,0x68732f6e69622fff
    shr rbx,0x8
    push rbx
    mov rsi,rsp
    mov dl,0x8
    xor rax,rax
    mov al,1
    syscall
    xor rax,rax
    mov al,0x3c
    syscall
what:
    call are

nasm -f elf64 test.asm ld -o test test.o

按预期运行。

但在shellcode中使用:

const char shellcode[] = "\x48\xbb\xff\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xeb\x08\x53\x48\x89\xe6\xb2\x08\x48\x31\xc0\xb0\x01\x0f\x05\x48\x31\xc0\xb0\x3c\x0f\x05";

int main(){
    ( (void (*)(void))&shellcode )();
    return 0;
}

gcc -fno-stack-protector -z execstack -o test2 test.c

它什么也不打印。


在此处输入图片说明

在此处输入图片说明

您的代码假定rdi == 0、1或2,并且rdx 56个高位为零。 在过程开始时确实如此。 在您调用shellcode的时候,事实并非如此。

要解决此问题,您需要将rdi设置为1(如果要使输出为标准输出)或2(使输出变为标准错误),并设置rdx 8。


Linux在x86-64上的syscall ABI是

  • rax系统调用号

  • charrdirsirdxr10r8r9寄存器中的charshortintlong和指针参数

  • 返回值将是rax ; 如果发生错误,大多数系统调用会返回-errno

    (实际的errno变量是C库构造,内核对此一无所知)

  • rcxr11被破坏(可以由syscall修改); 所有其他寄存器均保留

因此,对于writeSYS_write == __NR_write == 1),您将rax == 1设置为; rdi ==描述符号码( STDOUT_FILENO标准输出== 1, STDERR_FILENO == 2为标准误差); rsi ==指向要写入的数据的指针,而rdx ==指向要写入的字符数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM