1
wevsty 2017-10-25 18:23:45 +08:00
这种情况一般是程序其他地方溢出覆盖了不该覆盖的地方导致的。
|
2
katsusan OP @wevsty 我原本也是这样想的,但是刚刚查资料提到说程序执行时的代码段区域是只读的,只读区域应该不能被覆盖吗吧
|
4
katsusan OP |
5
momocraft 2017-10-25 18:42:01 +08:00
Delete 是什麼
|
7
wevsty 2017-10-25 19:06:04 +08:00 2
@katsusan 事实是可以的。这部分所谓的只读意思是,告诉你不能修改,但是如果你硬要修改是有办法的。毕竟代码同样会被加载到内存上而内存本来就是可读写的。
一般来说,下一条指令要执行的机器码错误多半是由于跳转的地址错误,调用函数实际上要执行 call 指令,而 call 指令是要把 IP ( X86 上是 EIP )寄存器存放到栈空间里的,如果函数里面错误的修改了栈空间里 IP ( EIP )的内容,那么在函数退出的时候 ret 指令就会把错误的值还原到 IP ( EIP ),这样你就会看到下一条执行的指令不正确了。 所以一般来说类似 delete 这种函数执行的时候如果出现这样的问题,多半是因为栈空间进行了错误的写入。仔细检查是否有越界的情况产生。 |
9
NoAnyLove 2017-10-25 23:04:04 +08:00 1
正常情况下,如果没有修改代码段的属性,对代码段进行写操作会产生 segmentation fault,除非进行了特殊操作,比如 mprotect
|