学习:汇编语言

nop指令:空指令,什么都不操作,唯一变化的就是EIP当前指向的地址

需要讲的就是字节的问题:

首先我们看到
00401002 |. E8 FF040000 call <jmp.&KERNEL32.GetModuleHandleA> ; \GetModuleHandleA

这个地址中的数据E8 FF040000有5个字节,那么我们现在进行修改为将call的地址的汇编指令修改为je 0040101D,相当于跳转到0040101D这个地址上

我们发现了jz跳转占两个字节 所以还多出了三个字节,那么就会利用nop指令进行填充,

push指令:入栈,大致上有三种操作

第一种:push 0x0,也就意味着直接把0x0直接压入堆栈中,单步步过,发现堆栈窗口中储存了一个00000000的数值的地址,那么也就是压入成功了

第二种:push eax,也就意味着还可以把数据寄存器中的数值压入堆栈中

第三种:push 041000,这里的地址也就是00401000也就是当前程序的入口点的地址,也就意味着我们还可以把地址相应的存储地址压入到堆栈中

同样的我们也可以讲当前的地址中的数值压入堆栈中,push [401000]利用方括号进行包裹,修改完就自动变成push dword ptr ds:[0x401000],自己理解的是push 一个dword类型的四个字节的0x401000地址中的值,结果为如下

但是我们发现好像跟401000中的地址的值不像啊,那么可以通过转到数据窗口跟随的操作来看下数据为多少

值为6A 00 6A 01,然后堆栈中存储的是反着来的016A006A,这也是寄存器保存的特性,记住就好了


pop指令:出栈

继续上面来,自己已经把几个数据压入到堆栈中了,我们可以通过pop将堆栈中的数据取出,并且还可以赋予给数据寄存器

小知识点:push相关的指令还有个是pushad 和pusha,pushad是把当前数据寄存器中的值全部都压入到堆栈中,而pusha只压出16位,比如eax中的值12345678,只压入其中的ax(再普及下 ax又分为ah al)

而popad和popa相关的指令也类似只是作用是出栈

自己的理解:pushad和popa相当于起到一个备份的作用


mov指令:赋值操作

载入od,修改当前汇编指令为mov ecx,eax,然后进行单步步过,发现寄存器中的ecx为eax的值

我们还可以mov [402000],eax,将eax寄存器中的值赋值给402000地址的值,进行单步步过

这里自己先做个笔记:符号为0为正数 1为负数

猜你喜欢

转载自www.cnblogs.com/zpchcbd/p/12041891.html