zoukankan      html  css  js  c++  java
  • 学习:汇编指令

    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为负数

    第二种:

    movsx指令:带符号扩展,16位的赋值给32位的操作,并且填充以当前16位的符号位进行判断,如果为正数则前两个字节用0开填充,如果是负数的话,则用F来填充

    把ebx寄存器中的值修改为0000A123,再把当前汇编指令修改为movsx eax,bx,然后进行单步步过,发现eax的值为FFFFA123,前两个字节都用F来填充了,为什么呢?因为上面说过了符号位进行判断,A123的符号位为1所以为负数,那么就用F来填充

    我们可以再拿一个正数来试试,将ebx寄存器中的值修改为00001234,然后同样上面的操作,发现是0来填充的,因为1234的二进制的符号位是0,那么为正数,就用0来填充

    第三种:

    movzx指令:不带符号扩展,16位的赋值给32位的操作,空的都用0来填充

    跟上面的一样,唯一不同的就是movzx填充的时候不会根据符号位来判断,都是用0来填充,比如修改ebx寄存器来0000A123,然后进行赋值操作movzx eax,bx,结果发现还是0000A123


    lea指令:取源操作数地址的偏移量,并把它传送到目的操作数所在的单元

    把当前的地址汇编指令修改为:lea eax,[eax+0x16],再把当前eax中的保存的地址值修改为401000,然后进行单步步过,发现eax中变为了00401016

    这里唯一不同的就是[]这个符号不是取地址中的值,相当于没有一样,但是还是需要写,但是表示的还是传地址,不是传地址中的值,然后+0x16则表示偏移量,在eax偏移0x16的地址再赋给eax寄存器


    XCHG指令:互换地址

    将eax的地址值修改为0401000,然后当前的ecx的值为0012FFB0,将当前地址的汇编指令修改为XCHG eax,ecx,然后进行单步步过,发现值进行了互换


  • 相关阅读:
    MySQL3:索引
    MySQL4:存储过程和函数
    MySQL2:四种MySQL存储引擎
    MySQL1:MySQL函数汇总
    web.xml详解
    SharePoint 多行文本字段设置默认值
    SharePoint Online 自定义Modern UI表单
    Server-side activities have been updated. You need to restart SharePoint Designer to use the updated version of activities.
    计算请假天数JavaScript方法
    SharePoint 2019 离线安装准备工具
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/12041891.html
Copyright © 2011-2022 走看看