我在写作时遇到违规行为"下面代码中的错误,同时将空字节放在字符串中通过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#'
答案 0 :(得分:2)
您正在运行自我修改代码:根据平台的不同,它可能会起作用。在保护模式下,它将无法工作,因为代码段是只读的(它可以在DOS上完美地工作在386上)
您必须将字符串放在数据段中,或者指示链接器在.text段中放置一个“可写”标记(类似于:/SECTION:.text,EWR
)。
最后一种方法令人不悦,因为(a)编码实践不佳,(b)被所谓的“多态”病毒引擎使用,并被反病毒软件拒绝,(c)可能会干扰虚拟化环境操作,最后(d)可能不起作用,显然是随机的,由于处理器预取而有一些硬件配置。
除非你有一个非常紧迫的理由,否则我建议你声明一个数据段并将你的字符串放在那里。
答案 1 :(得分:1)
通常为代码指定的部分/段是可执行的和只读的,也就是说,写入它们是行不通的。
您需要将字符串放在数据部分,例如.data
。
此外,您可能希望将mov byte [esi + 17],al
之后的执行转移到stuff:
以外的某个位置,否则您的程序将进入无限循环。