汇编系统调用无效
assembly system call non-effective
我想用以下内容打印 AAAA:
BITS 32;
;write;
push 0x41414141;
pop ecx ;
mov eax, 4 ; write is syscall 4 for Ubuntu 32-bit
mov ebx, 1 ; stdout
mov edx, 4 ;
int 0x80 ;
;exit;
mov eax, 1 ;
mov ebx, 0 ;
int 0x80 ;
然而,一旦组装和链接此代码仅存在,没有错误,有什么问题吗?
快速修复您的代码:
push 0x41414141 ; put 'AAAA' into stack memory
mov ecx,esp ; pointer to the 'AAAA'
mov eax, 4 ; write is syscall 4 for 32-bit Linux
mov ebx, 1 ; stdout
mov edx, 4
int 0x80
add esp,4 ; restore stack
没有解释,因为你应该首先检查我在评论中提出的问题,然后修复将是显而易见的,或者你将不得不询问一些你不理解的特定问题...
如果您 运行 使用 strace ./my_program
的原始代码,您会看到 write()
return -EFAULT 因为您传递了错误的地址。始终使用 strace
调试进行系统调用但行为不符合预期的程序。
我想用以下内容打印 AAAA:
BITS 32;
;write;
push 0x41414141;
pop ecx ;
mov eax, 4 ; write is syscall 4 for Ubuntu 32-bit
mov ebx, 1 ; stdout
mov edx, 4 ;
int 0x80 ;
;exit;
mov eax, 1 ;
mov ebx, 0 ;
int 0x80 ;
然而,一旦组装和链接此代码仅存在,没有错误,有什么问题吗?
快速修复您的代码:
push 0x41414141 ; put 'AAAA' into stack memory
mov ecx,esp ; pointer to the 'AAAA'
mov eax, 4 ; write is syscall 4 for 32-bit Linux
mov ebx, 1 ; stdout
mov edx, 4
int 0x80
add esp,4 ; restore stack
没有解释,因为你应该首先检查我在评论中提出的问题,然后修复将是显而易见的,或者你将不得不询问一些你不理解的特定问题...
如果您 运行 使用 strace ./my_program
的原始代码,您会看到 write()
return -EFAULT 因为您传递了错误的地址。始终使用 strace
调试进行系统调用但行为不符合预期的程序。