我正在尝试更改我的小型 x86 二进制文件中 nasm 的
section .bss
内的数据,但它不起作用。
我有一个用于 Linux 二进制文件的小 ELF 标头(类似于 here 中的最后一个标头)和预定义的字符串打印到 Linux 控制台:
global _start
BITS 32
org 0x00010000
; tiny ELF header
_start:
mov ecx, string1
mov ebx, 1
mov dx, 8
mov ax, 4
int 0x80
xor eax, eax
mov ebx, eax
inc eax
int 0x80
section .data
string1 db "Hello!", 0xa
但我需要一个可修改的文本缓冲区。我创造了
section .bss
printable: resb 19 * 18
在我的源代码末尾并开始修改它们
cld
mov esi, string1
mov al, 0x20
mov ecx, 0x01
rep stosb
由于分段错误而失败。无论是使用
mov [esi],al
更改一个字节还是使用 rep stosb
、string1
或 printable
内存地址进行块更改 - 一切都会因分段错误而崩溃。
怎么了?
因此,我想要一个可修改的保留内存,但不放置在我的二进制文件中。所以我想通过代码构建文本。
mov dx, 8 mov ax, 4
你需要使用32位寄存器
cld mov esi, string1 mov al, 0x20 mov ecx, 0x01 rep stosb
ESI 寄存器不是
rep stosb
的输入。为此使用 EDI。mov edi, printable
mov esi, string1
mov ecx, 7
rep movsb