首页
社区
课程
招聘
[旧帖] 王爽 的10.4问题求解答 0.00雪花
发表于: 2010-10-29 21:00 3878

[旧帖] 王爽 的10.4问题求解答 0.00雪花

2010-10-29 21:00
3878
1000:0   mov ax,6   ;; ax=6,ip指向1000:3
1000:3    call ax       ;;
1000:5   inc ax
1000:6    mov bp,sp      ;;bp=sp=fffeh
               add ax,[bp]    ax=[6+ds:(fffeh)]=6+5=0bh
            求ax的值

就想问一下 bp=sp=fffeH 这个地址是怎么来的,在百度上 和这个解答不一样
说call cx后把ip压入栈也就是0005 sp指向栈顶,mov bp,sp后[bp]的值=栈里的5 所以add ax,[bp]=6+5=11 我想问 bp对应得段寄存器不应该是ds吗?这里也没有显示指向ss段 怎么取得的5呢?
那位大哥给解答下,问题不难 就是估计我绕进去了 在线等 先谢了

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 38
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
BP 默认 对应 SS 不是 DS
2010-10-29 22:19
0
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
bp=sp=fffeH 这个地址是怎么来的?
不用关心这个地址是怎么来的,只要关心这个地址里面装的值,实际上这个地址是用debug跟踪器看出来

的,还可以是别的16进制,不管是什么,它里面装的都是刚入栈的偏移地址0005(call ax 的下一条指令

的偏移地址);
mov bp,sp ; 只是寄存器之间的操作,让bp指向sp单元的值,这样在下一步的[bp]就是取sp这个地址里

面的值也就是偏移地址0005;
注意call ax的调用 相当于执行:push ip , jump ax
2010-11-2 16:22
0
雪    币: 245
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我想问 bp对应得段寄存器不应该是ds吗?这里也没有显示指向ss段 怎么取得的5呢?

BP的默认段寄存器与BX|SI|DI不同,使用SS。除非显式指定使用DS。

当执行mov bp,sp和add ax,[bp]后就相当于执行了add ax,[sp],而bp默认的段寄存器是ss,所以执行完这两条语句就相当于把ax的值加上ss:sp所指向的值,而ss:sp所指向的值正是call ax时放进栈中的IP的值
所以就是ax=6h+5h=0bh
2010-11-3 10:57
0
雪    币: 4
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
在王爽的书中162页 (3)中写到 只要在·[...]中使用寄存器BP,而指令中没有显性地给出段地址,段地址就默认在SS中。

不错,它的确是一个寄存器,它的用途有点特殊,是和堆栈指针SP联合使用的,作为SP校准使用的,只有在寻找堆栈里的数据和使用个别的寻址方式时候才能用到
比如说,堆栈中压入了很多数据或者地址,你肯定想通过SP来访问这些数据或者地址,但SP是要指向栈顶的,是不能随便乱改的,这时候你就需要使用BP,把SP的值传递给BP,通过BP来寻找堆栈里数据或者地址.
  

把这个理解了你的问题就好办了
2010-11-3 12:20
0
雪    币: 204
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
没书 是在没理解到意思
2010-11-3 13:01
0
游客
登录 | 注册 方可回帖
返回
//