Nasm x86-64中的Hello World程序连续打印Hello World

用户名

您能否在此代码上为我提供帮助。执行后,程序将连续打印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
斯科特

解释

  • 您在x86-64 Linux上使用了错误的系统调用号。因此,您的exit()呼叫失败,而是doworkcallback在相互递归结束,导致一个循环。
  • 有关正确的系统调用号,请参阅Linux源代码中的arch / x86 / syscalls / syscall_64.tbl

1 common write sys_write 231 common exit_group sys_exit_group

  • 如果您愿意使用AT&T x86汇编程序语法和C预处理程序,则可以#include <sys/syscall.h>使用例如SYS_write作为的系统调用号writehello-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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Nasm Hello World Bus错误OS X

来自分类Dev

Nasm Hello World Bus错误OS X

来自分类Dev

x86 NASM程序中的分段错误

来自分类Dev

在OS X Swift应用程序中单击按钮时,Xcode可以打印“ Hello World”吗?

来自分类Dev

Hello World中架构x86_64的未定义符号

来自分类Dev

x86 Assembly OS Hello World无法按预期工作

来自分类Dev

Linux上的NASM Hello World:对“ main”的未定义引用

来自分类Dev

Linux上的NASM Hello World:对“ main”的未定义引用

来自分类Dev

Strace Hello World程序

来自分类Dev

扩展的Hello World程序

来自分类Dev

如何在 Mac 上的 x86 程序集 (NASM) 中打印有符号整数

来自分类Dev

Hello World程序Nasm Assembly和C的已执行指令数不同

来自分类Dev

Apache中的Hello World

来自分类Dev

Hello World无法打印。错误

来自分类Dev

在终端中以不同颜色打印Hello World

来自分类Dev

NASM中带有LINK.EXE和WinAPI的Hello world

来自分类Dev

如何在Linux x86 NASM中打印字符?

来自分类Dev

如何在Linux x86 NASM中打印字符?

来自分类Dev

mbed中的Hello World MQTT程序

来自分类Dev

了解程序集Hello World

来自分类Dev

该汇编程序如何打印“ Hello World”?

来自分类Dev

OpenCV 4.5.1 x86版本中缺少Opencv_world451.dll

来自分类Dev

这个 x86 Hello World 使用来自 _start 的 32 位 int 0x80 Linux 系统调用的解释是什么?

来自分类Dev

输入不正确的程序集x86 NASM

来自分类Dev

EmberJs错误中的Hello World

来自分类Dev

Ruby on Rails 中的 Hello world

来自分类Dev

NASM x86组件中的C浮动

来自分类Dev

如何在NASM x86中定义宏

来自分类Dev

编译后64位Hello world冻结