文章目录
内存的寻址方式
寻址公式一:【立即数】
读取内存的值:
mov eax,dword ptr(pointer) ds:[0x13ffc4]
向内存中写入数据
mov dword ptr ds:[0x13ffc4],eax
获取内存编号
lea eax,dword ptr ds:[0x13ffc4]
寻址公式二:【reg】
reg代表寄存器 可以是8个通用寄存器中的任意一个
读取内存的值:
mov ecx,0x13ffd0
mov eax,dword ptr ds:[ecx]
向内存中写入数据:
mov edx,0x13ffd8
mov dword ptr ds:[edx],0x12345678
获取内存编号:
lea eax,dword ptr ds:[edx]
mov eax,dword ptr ds:[edx]
寻址公式三:[reg+立即数]
读取内存的值:
mov ecx,0x13ffd0
mov eax,dword ptr ds:[ecx+4]
向内存中写入数据:
mov edx,0x13ffd8
mov dword ptr ds:[edx+0xc],0x12345678
获取内存编号:
lea eax,dword ptr ds:[edx+4]
mov eax,dword pte ds:[dex+4]
寻址方式四:[reg+reg*(1,2,4,8)]
读取内存的值:
mov eax,13ffc4
mov ecx,2
mov edx,dword ptr ds:[eax+ecx*4]
向内存中写入数据:
mov eax,13ffc4
mov ecx,2
mov dword ptr ds:[eax+eax*4],0x12345678
获取内存编号:
lea eax,dword ptr ds:[eax+ecx*4]
寻址方式五:[reg+reg*(1,2,4,8)+立即数]
读取内存的值:
mov eax,13ffc4
mov ecx,2
mov edx,dword ptr ds:[eax+ecx*2+4]
向内存中写入数据
mov eax,13ffc4
mov ecx,2
mov dword ptr ds:[eax+ecx*4+2],0x12345678
获取内存编码
lea eax,dword ptr ds:[eax+ecx*4+4]
堆栈
堆栈的优点:临时存储大量的数据,便于查找
入栈
方法一:
mov dword ptr ds:[edx-4],0XAAAAAAAA
sub edx,4
方法二:
sub edx,4
mov dword ptr ds:[edx],0xbbbbbbbb
方法三:
mov dowrd ptr ds:[edx-4],0xsssssssss
lea edx,dword ptr ds:[edx-4]
方法四:
lea edx,dword ptr ds:[edx-4]
mov dword ptr ds:[edx],0xeeeeeeee
出栈
出栈跟入栈类似,出栈是栈顶的指针内存地址加四而入栈是减四
push和pop指令
push是入栈指令(上面方法二合一)
pop是出栈指令(也是两步命令二合一)
这两个命令也会改变内存(EIP)
mov esp,ebp
pop ebp
局部变量是从ebp-4开始 参数是ebp+8 返回地址(eip)是ebp+4
局部变量(ebp-4) |
---|
ebp |
返回地址(ebp+4) |
参数(ebp+8) |
图片借鉴:滴水逆向