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