逆向知识点
mov eax,0x123456789
当数据超出范围时,会舍弃低位
eax的值为23456789
eax0-31 ax 0-15 al 0-7 ah 8-15
mov add sub and or xor not等指令源操作数和目标操作数都可以为内存,但不能同时为内存
寄存器在cpu内部,执行速度快
内存:
byte 8bit word 16bit dword 32bit
加[]的为地址,没有为立即数
往内存中写入数据时一定要知道其宽度
mov word ptr ds:[0x123456789],0xffff
计算机能够识别地址的5种方式
1.立即数
读取内存的值:
mov eax/ax/ah/al,dword/word/byte ptr ds:[0x11234564]
想内存单元写入数据
mov dword/word/byte ptr ds:[0x11234564],eax/ax/ah/al
获取内存编号
lea eax,dword/word/byte ptr ds:[0x11234564]
2.寄存器
3.寄存器+立即数
4.寄存器+寄存器*(1,2,4,8)//数组
5.寄存器+寄存器*(1,2,4,8)+立即数
堆栈:
windows堆栈方式从高地址往低地址
1.存储临时数据,数据量多
2.能够快速找到数据
3.能够记录存储数据的个数
push和pop操作如果为立即数,则一定+/-4个字节
实现 用一个寄存器存储数据的基址
用另一个寄存器存储数据的top
操作系统提供默认的堆栈
ebp栈底地址
esp栈顶地址
模拟栈
mov ebx,0x1234ffff //base
mov edx,0x1234ffff //top
1.先存数据,后改变top的值
mov dword ptr ds:[0x1234ffff],aaaaaaaa
sub edx,4
2.先改变top的值,后存储数据
lea edx,dword ptr ds:[edx-4]
mov dword ptr ds:[edx],bbbbbbbb
读取的两种方式
1.栈顶+偏移
2.栈底+偏移
trace me知识点
1.pe结构
2.下断点 程序运行到此处会停下来
3.win32api
4.什么是函数调用
5.熟悉堆栈
6.call jcc 标志寄存器决定jcc的跳转
标识寄存器0202 0000001000000010(为1为系统已经默认)
一定要注意数据的宽度
进位标志位cf(在32位中的第0位) 最高位产生进位或则借位为1,否则为0
表示无符号数运算结果是否超出范围
奇偶标志位pf 用于反应结果中最低有效字节为的1的个数的奇偶性,偶数位为1,奇数为0
辅助进位标志位af
有进位或借位置1
双字ffffffff看字为有没有进位或借位
字ffff看字节位有没有进位或借位
字节ff看第二个f有没有进位或借位
零标志位位zf 用来判断运算结果是否为0,为0则该标志为1
符号标志位sf 与运算结果的最高位相同(正负)
溢出标志位of 用来判断运算结果是否产生溢出
符号位有无进位
最高位有无向符号位的进位
两个结果异或求值
有符号数的运算结果是否超出范围
adc带进位加法
sbb带借位减法
xchg数据交换指令
movs可以两边都为内存
移动字节 mov byte ptr ds:[edi],byte ptr ds:[esi] 简写movsb
移动字 movsw
移动双字 movsd
移动完之后会改变esi,edi会加1/2/4
方向标志位df 置1时,会减1/2/4
stos指令
将al/ax/eax的值存储到[edi]指定的内存单元
存多少由byte/word/dword决定
rep指令根据ecx中的值来确定重复执行的次数
jmp指令 寄存器/立即数
实际是修改寄存器eip的值,来决定执行的指令
call指令
修改eip的值
将call调用的下一条指令的地址保存在堆栈里面
地址为上一条指令的地址加上指令的长度
rtn指令
相当于pop eip弹栈
cmp指令
相当于sub指令,但并不保存结果而是影响标志位
test指令
相当于cmp指令,进行与操作,影响标志位
jcc指令集
全部针对标志寄存器决定是否跳转
mov ecx,10
mov eax,cccccccc //int 3
rep stos dword ptr es:[edi]
防止缓冲区溢出
堆栈平衡
函数调用前和函数调用后堆栈不变
外平栈
在堆栈外面通过+来保持堆栈平衡