简单ASM代码上的分段错误

时间:2014-01-14 17:15:09

标签: nasm shellcode

当我试图在ubuntu 64位版本下创建一个NASM示例并在汇编并链接到ELF后执行它时我的问题。执行

时,它会返回如下错误消息

NASM -f elf64 -o firstasm.o firstasm.asm ld -o firstasm firstasm.o firstasm

分段错误(核心转储)

我的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代码有什么问题,以及解决“分段错误(核心转储)”问题的建议。感谢任何人都可以帮忙。

1 个答案:

答案 0 :(得分:0)

呃,你在哪里得到系统电话号码?你把它们拉出来了吗?

64位sys_exit = 60 32位sys_exit = 1

64位sys_write = 1 32位sys_write = 4

Linux 64-bit System Call List

Linux 32-bit System Call List

Linux System Call Table for x86_64

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

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

32位sys_exit:

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

64位sys_exit:

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。

现在我向您展示了退出系统调用与提供的链接之间的区别,您可以修复您的写入系统调用是否正确。