簡體   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