leewon 发表于 2013-8-27 21:40:21

为啥修改了sp寄存器后,程序代码被更改了

程序源代码如下,是根据10.6 转移地址在内存中call指令练习来修改的,把注释部分打开程序是可以正常执行的,也能得到和
书上说的预期效果,如果把注释部分去掉,在执行完mov sp,10h后,后面的mov ds:,ax指令就会被更改了。没有想明白,
为啥mov sp,10h 操作后,cs代码段所指向的数据会被更改,具体的调试过程如图所示。
---------------------------------
assume cs:codesg;,ds:datasg
;datasg segment
;db 1
;datasg ends
codesg segment
start: mov sp,10h
   ;mov ax,datasg
   ;mov ds,ax
   mov ax,0123h
   mov ds:,ax
   call word ptr ds:
   
   mov ax,4c00h
   int 21h
codesg ends
end start
-------------------------------------

LinuxDeepin 发表于 2013-8-27 21:40:22

leewon 发表于 2013-8-27 22:29 static/image/common/back.gif
是直接加载的debug源码,蓝色的注释恢复为正常代码是没问题的,如果就把我发布的代码拿去执行,保留代码, ...

你注意一下被修改的数据是 ss:sp所指向的栈顶下方。
你的 ss 栈寄存器与 CS 代码寄存器处于同一个段了。
重新运行debug 调试 exe 文件,如果发现栈段还是和 CS 段一致的话,
那么修改一下 ss 寄存器的数值,使用 r 命令 修改 ss为 14F5 。
或者在代码开头定义一段栈段,
assume ss:stacksg

       stacksg segment
            dw,0,0,0,0,0,0,0,0
       stacksg ends

      codesg segment
      start:
            mov ax,stacksg
            mov ss,ax
         codesg ends


end start   

牡丹花下死做鬼 发表于 2013-8-27 22:08:17

cs:ip 指向代码
你改了cs的值 代码不变才怪

LinuxDeepin 发表于 2013-8-27 22:15:39

本帖最后由 LinuxDeepin 于 2013-8-27 22:29 编辑

你的 ss 栈寄存器与 CS 代码寄存器处于同一个段了。重新运行debug 调试 exe 文件,如果发现栈段还是和 CS 段一致的话,
那么修改一下 ss 寄存器的数值,使用 r 命令 修改 ss为 14F5 。
或者在代码开头定义一段栈段,
assume ss:stacksg

       stacksg segment
            dw,0,0,0,0,0,0,0,0
       stacksg ends

      codesg segment
      start:
            mov ax,stacksg
            mov ss,ax
         codesg ends


end start   



小咒 发表于 2013-8-27 22:20:50

本帖最后由 小咒 于 2013-8-27 22:39 编辑

assume cs:codesg;,ds:datasg
;datasg segment
;db 1
;datasg ends
codesg segment
start: mov sp,10h
   ;mov ax,datasg
   ;mov ds,ax首先你要了解ds:ip指向的是数据段,cs:ip指向的是代码段
;mov ax,datasg这一句的意思是指向了定义的ds:datasg也就是数据段
你把ds:datasg注释起来了,自然就找不到数据段了

leewon 发表于 2013-8-27 22:25:13

看我跟踪的结果,程序debug载入后,就执行了一跳mov sp,0010h后,立即查看了14f2:00代码段处的内容。
已经被修改了。我就是想问,为啥执行mov sp,0010h后,紧接着的第二条命令mov ax,0123是可以正常执行的。但是接下来的mov ds:,ax 已经被改掉了。这个是被谁改掉的?执行前cs=14f2,执行后cs=14f2.只是ip指向下一条命令了,cs:ip正常按照流程执行,只是cs:ip指向的内容被重写了。不知道是什么机制重写的,重写的数据源又是从哪里来的?

leewon 发表于 2013-8-27 22:29:21

LinuxDeepin 发表于 2013-8-27 22:15 static/image/common/back.gif
你的 ss 栈寄存器与 CS 代码寄存器处于同一个段了。修改一下 ss 寄存器的数值,使用 r 命令 修改 ss为 14 ...

是直接加载的debug源码,蓝色的注释恢复为正常代码是没问题的,如果就把我发布的代码拿去执行,保留代码,你会发现原来cs:ip处指向的自己的代码被更改了10个字节,没想明白怎么会触发这个更改?

LinuxDeepin 发表于 2013-8-27 22:36:25

leewon 发表于 2013-8-27 22:29 static/image/common/back.gif
是直接加载的debug源码,蓝色的注释恢复为正常代码是没问题的,如果就把我发布的代码拿去执行,保留代码, ...

被 栈 给改了,没注意到sp指向10H吗?
10H等于栈顶,被修改的10个字节处于栈顶内部
页: [1]
查看完整版本: 为啥修改了sp寄存器后,程序代码被更改了