汇编小知识之【jmp+call】
本帖最后由 千里冰封 于 2016-12-19 09:58 编辑大家都知道,在od里能看到很多,汇编指令,比如push 、mov、jmp、call 等等{:5_122:}评分甩甩,大步走来,前方高能,花见花开{:5_123:}
看具体代码如下:{:5_117:}
00401004/.55 push ebp
00401005|.8BEC mov ebp,esp
00401007|.68 02000080 push 0x80000002
0040100C|.6A 00 push 0x0
0040100E|.68 01000000 push 0x1
00401013|.6A 00 push 0x0
00401015|.6A 00 push 0x0
00401017|.6A 00 push 0x0
00401019|.68 01000100 push 0x10001
0040101E|.68 05000106 push 0x6010005
00401023|.68 06000152 push 0x52010006
00401028|.68 03000000 push 0x3
0040102D|.BB D0104000 mov ebx,004010D0
00401032|.E8 8E000000 call 004010C5
00401037|.83C4 28 add esp,0x28
0040103A|.8BE5 mov esp,ebp
0040103C|.5D pop ebp
0040103D\.C3 retn
0040103E/.55 push ebp
0040103F|.8BEC mov ebp,esp
00401041|.68 02000080 push 0x80000002
00401046|.6A 00 push 0x0
00401048|.68 01000000 push 0x1
0040104D|.6A 00 push 0x0
0040104F|.6A 00 push 0x0
00401051|.6A 00 push 0x0
00401053|.68 01000100 push 0x10001
00401058|.68 0A000106 push 0x601000A
0040105D|.68 0B000152 push 0x5201000B
00401062|.68 03000000 push 0x3
00401067|.BB D0104000 mov ebx,004010D0
0040106C|.E8 54000000 call 004010C5
00401071|.83C4 28 add esp,0x28
00401074|.8BE5 mov esp,ebp
00401076|.5D pop ebp
00401077\.C3 retn
00401078 $C3 retn
00401079 .C3 retn
0040107A/$B8 06000000 mov eax,0x6
0040107F|.E8 3B000000 call 004010BF
00401084|.FC cld
00401085|.DBE3 finit
00401087|.E8 ECFFFFFF call 00401078
0040108C|.68 79104000 push 00401079
00401091|.B8 03000000 mov eax,0x3
00401096|.E8 24000000 call 004010BF
0040109B|.83C4 04 add esp,0x4
0040109E|.68 01000152 push 0x52010001
004010A3|.E8 11000000 call 004010B9
004010A8|.83C4 04 add esp,0x4
004010AB|.E8 03000000 call 004010B3
004010B0|.33C0 xor eax,eax
004010B2\.C3 retn
004010B3 $FF25 EC784600 jmp near dword ptr ds:
004010B9 $FF25 F0784600 jmp near dword ptr ds:
004010BF $FF25 F4784600 jmp near dword ptr ds:
004010C5 $FF25 D0784600 jmp near dword ptr ds:
我们知道,左边的是,内存地址,中间的是十六进制机器码,右边的是汇编代码
那么机器码和汇编代码之间的关系如何?{:5_121:}
00401004/.55 push ebp
00401005|.8BEC mov ebp,esp
中间的机器码,55 就是汇编代码push ebp, 8BEC 就是汇编代码 mov ebp,esp 这些都是固定的,一 一对应的,大家可以去实际搜索一下。
0040108C|.68 79104000 push 00401079
这个代码 可以看出, 68 就是push的意思。68后面的 79104000 其实就是00401079。为什么看起来像倒着的呢?
这是因为,在计算机里面,数字是从低单元到 高单元 依次写入的。而一个的单元就是1个字节,1个字节就是8位,也就是2个十六进制位。
举个例子 十六进制 23 就是一个字节,08也是一个字节,4532 就是2个字节。那么4532在内存里是怎么存放呢?
遵从,低低高高原则{:6_210:}
比如有 10个单元,12345678910 。
4532这个十六进制数,低2位,是32,就放在1单元,高2位是45,就放在2单元。
所以十六进制数4532,在机器看来就是3245
注意看红色标记的代码
00401023|.68 06000152 push 0x52010006
00401028|.68 03000000 push 0x3
0040102D|.BB D0104000 mov ebx,004010D0
00401032|.E8 8E000000 call 004010C5
00401037|.83C4 28 add esp,0x28
***
***
**
00401067|.BB D0104000 mov ebx,004010D0
0040106C|.E8 54000000 call 004010C5
00401071|.83C4 28 add esp,0x28
***
***
***
004010BF $FF25 F4784600 jmp near dword ptr ds:
004010C5 $FF25 D0784600 jmp near dword ptr ds:
00401032|.E8 8E000000 call 004010C5 这个代码 E8 就是call的意思,但是E8后面的数,为啥和call后面不同
大家仔细观察00401032|.E8 8E000000 call 004010C5和004010C5 $FF25 D0784600 jmp near dword ptr ds:
这2个代码, call 后面的是地址,也就是jmp命令所在的地址。换句话说,call就是打电话给jmp,让jmp继续去做剩下的事。
可是电脑是怎么知道,call 打给了jmp呢,不是打给其他人了呢?
大家计算一下,从00401032 到004010C5之间的距离:004010C5- 00401032= 93
call 004010C5这句代码,占了多少个字节呢?
**** Hidden Message *****
补充内容 (2018-7-18 20:02):
有人想学汇编,可以看王爽老师写的“汇编语言第2版”,连接如下:
链接: https://pan.baidu.com/s/131bhqPemNI14D3Ae5xTuiA 密码: 6666 辛苦了! 看看隐藏的啥! 感谢分享,这个很有用,支持楼主继续,最好做一个系列,会帮助很多小白的
感谢分享,这个很有用,支持楼主继续!!! 雪花公子 发表于 2016-12-19 06:13
感谢分享,这个很有用,支持楼主继续,最好做一个系列,会帮助很多小白的
谢谢支持,你说的对,我努力把帖子都写成固定格式的,做系列{:6_215:} klamathrun 发表于 2016-12-19 09:13
感谢分享,这个很有用,支持楼主继续!!!
谢谢支持{:5_116:}有帮助就好{:5_121:} 精彩部分要动动手 感谢分享,这个很有用,支持楼主继续!!! 学习了,挺详细。谢谢 万分感谢楼主,简直是我等新手菜鸟的福音啊!!!