写入数据段时发生segfault,即使使用brk()分配了足够的空间

时间:2018-12-29 06:09:20

标签: assembly x86 nasm

我的想法是使用参数0调用brk()以获取数据段的当前结尾。然后添加我要分配的字节数,并使用新的大小再次调用brk。我在以下仿真器上使用nasm在32位Linux上运行此软件:https://www.tutorialspoint.com/compile_assembly_online.php

此后,我开始从数据段中的msg变量开始写入数据段。这是我的代码:

section .text
    global _start
_start:                     

    mov eax, 45     ;45 = brk() syscall number
    mov ebx, 0      ; invalid argument for brk

    int 0x80        ;eax now contains break

    mov esi, eax    ;save data segment break
    mov eax, 45
    add ebx, esi
    add ebx, 30000
    int 0x80        ; add 30,000 bytes to break
    mov edx, msg    ;load an address in the data section
    jmp smash_heap

exit:
    mov eax, 1
    int 0x80

smash_heap:
    mov edi, 10000
loop:
    cmp edi, 0
    je exit
    ;write to data segment
    inc edx
    mov word [edx], 'c'
    dec edi
    jmp loop

section .data

msg db  'Hello, world!',0xa ;get an address in the data segment

我遇到了细分错误!即使我分配了成千上万个字节,也超出了必要。谁能给我一些为什么会崩溃的提示?我对组装还是很陌生的,但是我所学到的有关数据段的所有内容都表明这应该可行。谢谢!

0 个答案:

没有答案