您能否在此代码上为我提供帮助。执行后,程序将连续打印Hello World,并且不会退出。我也想将此代码用作C程序中的shellcode,因此我没有在数据部分中定义Hello String。请让我知道问题出在哪里。
SECTION .text ; Code section
global _start ; Make label available to linker
_start: ; Standard ld entry point
jmp callback ; Jump to the end to get our current address
dowork:
pop rsi ;
mov rax,4 ; System call number for write
mov rdi,1 ; 1 for stdout
mov rdx,12 ; length of Hello World
syscall ; Switch to the kernel mode
mov rax,1 ;
xor rdi,rdi ;
syscall ;
callback:
call dowork ; Pushes the address of "Hello World" onto the stack
db 'Hello World',0xA ; The string we want to print
exit()
呼叫失败,而是dowork
和callback
在相互递归结束,导致一个循环。1 common write sys_write 231 common exit_group sys_exit_group
#include <sys/syscall.h>
使用例如SYS_write
作为的系统调用号write
。见hello-att.S
下文。这样,您就不必担心查找系统调用号。 SECTION .text ; Code section
global _start ; Make label available to linker
_start: ; Standard ld entry point
jmp callback ; Jump to the end to get our current address
dowork:
pop rsi ;
mov rax,1 ; System call number for write
mov rdi,1 ; 1 for stdout
mov rdx,12 ; length of Hello World
syscall ; Switch to the kernel mode
mov rax,231 ; exit_group(0)
xor rdi,rdi ;
syscall ;
callback:
call dowork ; Pushes the address of "Hello World" onto the stack
db 'Hello World',0xA ; The string we want to print
#include <sys/syscall.h>
.global _start
_start:
jmp callback
dowork:
/* write(1, "Hello World\n", 12) */
pop %rsi /* "Hello World\n" */
mov $SYS_write, %rax
mov $1, %rdi
mov $12, %rdx
syscall
/* exit_group(0) */
mov $SYS_exit_group, %rax
xor %rdi, %rdi
syscall
callback:
call dowork
.ascii "Hello World\n"
知道AT&T x86汇编器语法会使阅读Linux内核和glibc源代码变得容易得多;)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句