[英]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.