[英]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
系統調用號
char
在rdi
, rsi
, rdx
, r10
, r8
和r9
寄存器中的char
, short
, int
, long
和指針參數
返回值將是rax
; 如果發生錯誤,大多數系統調用會返回-errno
(實際的errno
變量是C庫構造,內核對此一無所知)
rcx
和r11
被破壞(可以由syscall修改); 所有其他寄存器均保留
因此,對於write
( SYS_write
== __NR_write
== 1),您將rax
== 1設置為; rdi
==描述符號碼( STDOUT_FILENO
標准輸出== 1, STDERR_FILENO
== 2為標准誤差); rsi
==指向要寫入的數據的指針,而rdx
==指向要寫入的字符數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.