【问题标题】:Segmentation Fault on simple ASM code简单 ASM 代码的分段错误
【发布时间】:2014-01-14 17:15:08
【问题描述】:

对于我的问题,当我尝试在 ubuntu 64 位版本下创建 NASM 示例并在组装并链接到 ELF 后执行它。当我执行时它返回如下错误消息

NASM -f elf64 -o firstasm.o firstasm.asm ld -o firstasm firstasm.o 第一手

分段错误(核心转储)

我的 NASM 代码将低于我尝试执行简单 write() 和 exit() 函数的位置

section .data ;Data segment

msg db "This line is test", 0x0a 

section .text ;text segment
global _start  ;Default entry point for ELF linking

_start:

; SYSCALL : write (1,msg,14)
xor rax,rax
xor rbx,rbx
xor rcx,rcx
xor rdx,rdx
mov rax,64 ; make a syscall write 4
mov rbx,1 ; put 1 into rbx and also stdout is 1
mov rcx,msg ;put address of string in rcx
mov rdx,19 ; put length of string into rdx
int 0x80   ; call kernel to made syscall

; SYSCALL : exit(0)
xor rax,rax
xor rbx,rbx
mov rax,93 ; make a syscall exit 93
mov rbx, 0  ; store 0 argument into rbx, success to exit
int 0x80

有人可以指出我的 NASM 代码有什么问题,并提出解决“分段错误(核心转储)”问题的建议。感谢任何可以提供帮助的人。

【问题讨论】:

    标签: nasm shellcode


    【解决方案1】:

    呃,你从哪里得到系统调用号码?你要把它们从空中拉出来吗?

    64 位系统退出 = 60 32bit sys_exit = 1

    64 位 sys_write = 1 32bit sys_write = 4

    Linux 64-bit System Call List

    Linux 32-bit System Call List

    Linux System Call Table for x86_64

    上面的链接将显示哪些寄存器用于什么。

    32位系统调用-int 0x80不使用64位寄存器,寄存器参数不同。 64位系统调用是-syscall。

    32 位系统退出:

    mov     ebx, ERR_CODE
    mov     eax, sys_exit  ; 1
    int     80h
    

    64 位系统退出:

    mov     rdi, ERR_CODE
    mov     rax, sys_exit  ; 60
    syscall
    

    看到区别了吗?

    如果您想为您的系统创建系统调用名称和编号的 inc 文件(可能由于某种原因它们不同)

    grep __NR /usr/include/asm/unistd_64.h | grep define | sed -e 's/\#/\%/' -e 's/__NR_/sys_/' > unistd_64.inc
    

    当然,为您的系统调整 unistd_64.h 的路径。 32 位也是一样,但我相信文件名为 unistd_32.h。

    现在我向您展示了 exit sys 调用和提供的链接之间的区别,您可以将您的 write 系统调用修正为正确。

    【讨论】:

    • 感谢 Gunner 的帮助,但我发现“系统调用”在 ubuntu 64 位 (x86_64) 上不起作用。你能告诉我如何使用它吗?
    • “不工作”是什么意思?展示您如何设置参数和使用syscall
    猜你喜欢
    • 2012-11-19
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多