程序集字符串修改访问冲突



我在下面的代码中收到"写入时访问冲突"错误,同时将空字节放入通过 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#'

您正在运行一个自我修改的代码:根据平台的不同,它可能有效,也可能无效。在保护模式下,它不起作用,因为代码段是只读的(它可以在 386 上的 DOS 中完美运行)

必须将字符串放在数据段中,或指示链接器在 .text 段中放置"可写"标记(类似于:/SECTION:.text,EWR )。

最后

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

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

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

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

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

最新更新