![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
汇编语言
oalken
这个作者很懒,什么都没留下…
展开
-
【2020.11.16】JCC
能修改EIP的指令有:JMP、CALL、RET JCC指令修改EIP寄存器属于无条件修改 但JCC指令修改EIP寄存器需要前置条件:标志寄存器中的值 CF:Carryflag(bit0) 若算数操作产生的结果在最高有效位(most-significantbit)发生进位或借位,则将其置1,反之清零。 这个标志通常用来指示无符号整数运算的溢出状态。 例:MOVAL,0xFEADDAL,0x2或MOVAL,0x7FSU...原创 2020-12-22 17:01:51 · 125 阅读 · 0 评论 -
【2020.11.16】ESP寻址、EBP寻址
CS:代码段寄存器DS:数据段寄存器SS:堆栈段寄存器如果包含ESP、EBP寄存器,则使用SS。ESP寻址存在局限性,ESP中存储的是栈顶的值,栈顶的值受汇编指令影响,如果执行过程中往栈中压入数据,那么ESP的值就一直在变。...原创 2020-12-22 16:59:15 · 512 阅读 · 0 评论 -
【2020.11.16】堆栈传参、堆栈平衡
堆栈传参 堆栈平衡 什么是堆栈平衡? 如果要返回父程序,则当我们在堆栈中进行堆栈的操作的时候,一定要保证在RET这条指令之前,ESP指向的是我们压入堆栈中的地址。 如果通过堆栈传递参数了,那么在函数执行完毕之后,要平衡参数导致的堆栈变化。 外平栈 在函数执行完成后,在函数的外边对堆栈进行平衡。 内平栈 在函数执行完成后,在RET指令之前对堆栈进行平衡。 内平栈的两种方式:...原创 2020-12-22 16:58:42 · 222 阅读 · 0 评论 -
【2020.11.15】反调试之Fake F8
调试器实现原理:使用0xCC断点、同INT3 单步步入:设置EFLAGS(EFL)的TF标志位TF标志位设置为1进入单步执行模式单步步过:在下一行设置断点CALL:在堆栈中储存CALL指令下一行地址ESP:栈指针寄存器/当前堆栈用的位置CALL指令会将CALL指令下一行的地址(0x00469F9C)压入堆栈,当使用F8单步步过CALL,在CALL执行完成后将返回到0x00469F9C处。当修改/破坏ESP后,再使用F8则无法从堆栈中找到返回地址(因为已经被破坏了),调试器自.原创 2020-12-22 16:58:11 · 193 阅读 · 0 评论 -
【2020.11.15】JMP/修改EIP的指令
EIP寄存器:CPU下一次将要执行的地址。 JMP:绝对跳转指令 MOV EIP,寄存器/立即数/内存 简写为 JMP 寄存器/立即数/内存 jmp 0x4183F4jmp dword ptr ds:[0x4183E1] CALL:PUSH下一行地址 MOV EIP,立即数/寄存器/内存简写为 CALL 立即数/寄存器/内存与JMP唯一的区别:在堆栈中储存CALL指令下一行地址 RET: 当前栈顶存放的值存放到EIP寄存器,同时..原创 2020-12-21 16:42:27 · 278 阅读 · 0 评论 -
【2020.11.15】堆栈相关指令
寄存器:ESP:栈指针寄存器/当前堆栈用的位置堆栈是从大地址到小地址的顺序使用的。堆栈的使用:存储数据mov dword ptr ds:[0x18FF88], 1 //向堆栈写入数据mov dword ptr ds:[0x18FF84], 2 //向堆栈写入数据sub esp, 8 //设置ESP、告诉系统堆栈使用到了哪里add esp, 8 //设置ESP、写入的数据不需要了,恢复堆栈位置太复杂了?试试堆栈相关指令!...原创 2020-12-21 16:41:55 · 421 阅读 · 0 评论 -
【2020.11.14】常用汇编指令
说明 r:通用寄存器 m:内存 imm:立即数 r8:8位通用寄存器 r16:16位通用寄存器 r32:32位通用寄存器 m8:8位内存 m16:16位内存 m32:32位内存 imm8:8位立即数 imm16:16位立即数 imm32:32位立即数 MOV:数据传送指令 MOVr/m8,r8MOVr/m16,r16MOVr/m32,r32MOVr8...原创 2020-12-21 16:41:36 · 1217 阅读 · 0 评论 -
【2020.11.14】内存存储模式
大端存储模式: 数据高位在内存低位,数据低位在内存高位。 mov byte ptr ds:[0x00000000], 0x1Amov word ptr ds:[0x00000000], 0x1A2Cmov dword ptr ds:[0x00000000], 0x1A2C3E4F 小端存储模式: 数据低位在内存低位,数据高位在内存高位。 mov byte ptr ds:[0x00000000], 0x1Amov word ptr ds:[0x000...原创 2020-12-21 16:40:33 · 104 阅读 · 0 评论 -
【2020.11.14】在汇编中内存地址的五种形式
形式一:立即数 读取内存的值:MOV EAX, DWORD PTR DS:[0X13FFC4]向内存中写入数据:MOV DWORD PTR DS:[0X13FFC4], EAX 形式二:[REG] REG代表寄存器只能是8个通用寄存器中的任意一个 读取内存的值:MOV EAX, 0x13FFD0MOV EAX, DWORD PTR DS:[ECX]向内存中写入数据:MOV EDX, 0x13FFD8MOV DWORD PTR DS:[EDX], 0x876...原创 2020-12-21 16:40:03 · 1283 阅读 · 0 评论 -
【2020.11.14】内存、MOV指令
每个进程拥有4GB的虚拟内存空间,在真正使用到时才会映射到物理内存上。为什么是4GB?4GB是由内存地址决定的,当内存地址为32位时(0x00000000),决定了寻址范围最大为0xFFFFFFFF+1(因为0x00000000也是一个地址,所以需要+1),最终结果为0x100000000。一个字节占8位,乘以8计算出0x800000000,将其转换为十进制为34359738368,除以8(得到整块内存能寻找的字节)结果为4294967296,再除以1024(得到KB),再除以1024(得到MB)原创 2020-12-21 16:39:33 · 1277 阅读 · 0 评论 -
【2020.11.13】通用寄存器
【寄存器类型】32位CPU:提供寄存器类型:8位、16位、32位。64位CPU:提供寄存器类型:8位、16位、32位、64位。【通用寄存器】EAX:通常用作返回值ECX:通常用作计数器ESP:通常用作堆栈/当前栈顶指针寄存器EBP:通常用作堆栈/当前栈底指针寄存器ESI:通常用作串复制源地址EDI:通常用作串复制目标地址为什么叫通用寄存器?在CPU中,其他寄存器都有自己特殊用途。例:EIP寄存器为计算机下次将要执行的指令,不能用作他用。8位、16位寄存原创 2020-12-21 16:39:01 · 262 阅读 · 0 评论