汇编字符串修改访问冲突

时间:2012-10-11 10:20:54

标签: assembly x86

我在写作时遇到违规行为"下面代码中的错误,同时将空字节放在字符串中通过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#'

2 个答案:

答案 0 :(得分:2)

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

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

最后一种方法令人不悦,因为(a)编码实践不佳,(b)被所谓的“多态”病毒引擎使用,并被反病毒软件拒绝,(c)可能会干扰虚拟化环境操作,最后(d)可能不起作用,显然是随机的,由于处理器预取而有一些硬件配置。

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

答案 1 :(得分:1)

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

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

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