【3.A.S.T】网络安全爱好者's Archiver

黑客学习

柔肠寸断 发表于 2009-5-18 08:59

汇编基础一日一学习3

[b][color=#ff0000]汇编基础一日一学习3

     大家可以直接点这个贴子上面的回复按钮,这样就不会看到其他学员的答案了。

   今天我们来学习下eip寄存器。不要小看这个寄存器。它可存储着我们cpu要读取指令的地址,没有了它,cpu就无法读取下面的指令(通俗点讲cpu就无法执行)。如果玩过破解,跟踪过程序的人都应该知道。每次相应汇编指令执行完相应的eip值就会增加。我大致描述一下这个寄存器的情况。

   

     因为80386 cpu的寻址范围是4GB。所以它的寻址模式是平坦模式的。这里我描述下cpu通过读取eip寄存器执行的大致过程。。

     此时我们假设一个程序开始执行了。首先PE loader装载我们的pe文件,读取我们pe文件的基地址和入口RVA地址(相对于基地址的偏移),并且读取相应节表结构的值,然后将我们的程序映射到内存。

    此时,映射到内存以后.. 此时PE loader把返回的程序入口点给cpu的eip寄存器赋值,然后通知我们的cpu:“ 并且说:我映射完了,你可以执行了。eip也相应的赋值了。此时cpu知道了eip的值,那么它通过将eip的值传送到输入输出电路,并送入相应的地址总线上。那么此时cpu就通过eip读取eip偏移上的二进制数据(我这里用汇编指令来表示)并传送到数据总线上,最后传送到指令缓冲区。传送到指令缓冲区后,那么此时eip会自动的增加其读入指令的数量,以便往下执行, 最后执行控制器第七指令缓冲区的指令并且往下执行。


    大致过程就是这样。因为我的美术功底实在不敢恭维。但是怕大家不理解。还是画个图片吧。不过这个图还不好画郁闷死列。。[/color][/b]



[img]http://www.hacker.com.cn/upload/forum/200804/20080409185559H.jpg[/img]






[b][color=black]我们cpu每次执行控制器读取完,相应的就在通过eip寄存器去进行下一次的读取指令工作。。每次cpu读取指令到指令缓冲区,相应的eip寄存器的值增加,增加大小的就是读取指令的字节大小(也可以说是长度)。。

   举个例子 我们程序的入口点是

    push  ebp 这个汇编指令。

     
                                                                  (注:此时eip+ 读取指令的大小)
   首先cpu - > 读取eip  - > 来到eip值的偏移 - > 读取push ebp ->  存放指令到指令缓冲区    - > 执行..  反复循环






   现在大家知道eip的作用性了吧。每次cpu执行都要先读取eip寄存器的值,然后定位eip指向的内存地址,并且读取汇编指令,最后执行。
   

   这里还要介绍一个jmp指令,大家都比较熟悉吧。。 但是你是否知道每次执行jmp 后,eip的值的变化呢。其实你猜测也可以猜测到。jmp顾名思义 跳转指令。执行后 eip的值=后面要跳转的地址。

举个例子:
       假设之前eip = 00403021h ,执行jmp 00403058h 。执行完指令后eip = 00403058H
      







小作业:

    1.假设目前的eip寄存器的值是  eip = 00400001h , 00400001h偏移处的汇编指令是mov ebp, esp,这个指令占2个字节。那么执行完这句指令后,此时的eip值是多少?



    2.执行以下几句指令后,eip发生了几次变化?

     push  ebp
     
     add ax,ax

     mov ebp


    3.执行以下语句后,eip发生了几次变化?最后的eip值等于多少

     push  ebp

     mov   ebp, esp

     jmp   00405060h[/color][/b]

lichun_530 发表于 2009-5-18 14:43

参观课堂!
偷偷来看

鬼子 发表于 2009-5-24 16:07

第一个是错的吧……

EndTo偌枫 发表于 2009-5-27 09:49

学习了 Y荡阿.em66.

柔肠寸断 发表于 2009-5-27 09:57

1.
eip=00400003H
小鱼老师说mov ebp,esp占用2个字节
那其他的指令占多少字节呢?
2.
经过三条指令后
eip变化了三次
3\
eip变化4次。


   因为读取push  ebp指令到指令缓冲区后,eip变化一次 。 读取mov   ebp, esp指令到指令缓冲区后eip变化一次。 读取 jmp   00405060h 到指令缓冲区后eip变化一次。 在执行jmp   00405060h 指令的时候
eip变化1次。

自在飞花 发表于 2009-6-2 22:40

[i=s] 本帖最后由 自在飞花 于 2009-6-2 22:43 编辑 [/i]

1.假设目前的eip寄存器的值是  eip = 00400001h , 00400001h偏移处的汇编指令是mov ebp, esp,这个指令占2个字节。那么执行完这句指令后,此时的eip值是多少?00400002h(错误,是我粗心造成的,加2后应为00400003H)
    2.执行以下几句指令后,eip发生了几次变化?3
     push  ebp
      add ax,ax
     mov ebp
    3.执行以下语句后,eip发生了几次变化?最后的eip值等于多少?4次,00405060H
     push  ebp
     mov   ebp, esp
     jmp   00405060h

scien 发表于 2009-6-5 18:00

好教材啊!!!  寄存器的名称要死记着{::dizzy::}

自在飞花 发表于 2009-6-5 22:11

[quote]好教材啊!!!  寄存器的名称要死记着{::dizzy::}
[size=2][color=#999999]scien 发表于 2009-6-5 18:00[/color] [url=http://3ast.com.cn/redirect.php?goto=findpost&pid=45567&ptid=8572][img]http://3ast.com.cn/images/common/back.gif[/img][/url][/size][/quote]
打印用张图贴在墙上,一共也没几个。

hkhs615 发表于 2009-12-17 16:18

学习.....................

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.