0

我在下面的代码中收到“写入时访问冲突”错误,同时将空字节放在通过 Ollydbg 检查的字符串最后一个字符中,任何人都可以帮忙解决这个问题,谢谢

[SECTION .text]

global _start

_start:

jmp short       stuff  
code:

pop             esi
xor             eax,eax          
mov byte        [esi + 17],al   ; put a null byte byte on [esi + 17]  

stuff:
call            code
db              'This is my string#'
4

2 回答 2

2

您正在运行自修改代码:取决于平台,它可能工作或不工作。在保护模式下,它不会工作,因为代码段是只读的(它可以在 386 上的 DOS 中完美工作)

您必须将字符串放在数据段中,或者指示链接器在 .text 段中放置一个“可写”标签(类似于:)/SECTION:.text,EWR

最后一种方法不受欢迎,因为(a)它是糟糕的编码习惯,(b)它被所谓的“多态”病毒引擎使用,并且被杀毒软件拒绝,(c)可能会干扰虚拟化环境操作,最后(d) 由于处理器预取,某些硬件配置可能无法正常工作,显然是随机的。

除非您有非常紧迫的理由这样做,否则我建议您声明一个数据段并将您的字符串放在那里。

于 2012-10-11T10:45:26.397 回答
1

为代码指定的节/段通常是可执行的和只读的,也就是说,写入它们是行不通的。

您需要将字符串放在数据部分中,例如.data.

此外,您可能希望将执行转移mov byte [esi + 17],al到 以外的某个位置stuff:,否则您的程序将进入无限循环。

于 2012-10-11T10:38:02.513 回答