鱼C论坛

 找回密码
 立即注册
查看: 1939|回复: 7

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

[复制链接]
发表于 2013-8-27 21:40:21 | 显示全部楼层 |阅读模式
3鱼币
程序源代码如下,是根据10.6 转移地址在内存中call指令练习来修改的,把注释部分打开程序是可以正常执行的,也能得到和
书上说的预期效果,如果把注释部分去掉,在执行完mov sp,10h后,后面的mov ds:[0],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:[0],ax
   call word ptr ds:[0]
   
   mov ax,4c00h
   int 21h
codesg ends
end start
-------------------------------------

问题描述

问题描述

最佳答案

查看完整内容

你注意一下被修改的数据是 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: ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-27 21:40:22 | 显示全部楼层

你注意一下被修改的数据是 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   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-27 22:08:17 | 显示全部楼层
cs:ip 指向代码
你改了cs的值 代码不变才怪
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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   



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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注释起来了,自然就找不到数据段了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-27 22:25:13 | 显示全部楼层
看我跟踪的结果,程序debug载入后,就执行了一跳mov sp,0010h后,立即查看了14f2:00代码段处的内容。
已经被修改了。我就是想问,为啥执行mov sp,0010h后,紧接着的第二条命令mov ax,0123是可以正常执行的。但是接下来的mov ds:[0],ax 已经被改掉了。这个是被谁改掉的?执行前cs=14f2,执行后cs=14f2.只是ip指向下一条命令了,cs:ip正常按照流程执行,只是cs:ip指向的内容被重写了。不知道是什么机制重写的,重写的数据源又是从哪里来的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-27 22:29:21 | 显示全部楼层
LinuxDeepin 发表于 2013-8-27 22:15
你的 ss 栈寄存器与 CS 代码寄存器处于同一个段了。修改一下 ss 寄存器的数值,使用 r 命令 修改 ss  为 14 ...

是直接加载的debug源码,蓝色的注释恢复为正常代码是没问题的,如果就把我发布的代码拿去执行,保留代码,你会发现原来cs:ip处指向的自己的代码被更改了10个字节,没想明白怎么会触发这个更改?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-27 22:36:25 | 显示全部楼层
leewon 发表于 2013-8-27 22:29
是直接加载的debug源码,蓝色的注释恢复为正常代码是没问题的,如果就把我发布的代码拿去执行,保留代码, ...

被 栈 给改了,没注意到sp指向10H吗?
10H等于栈顶,被修改的10个字节处于栈顶内部
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 06:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表