内存地址

od窗口简单认知

image-20230415093700265

在反汇编窗口和寄存器窗口数据都是高位在前低位在后,所以0x12345678这个数据的最高位是0x12,为什么不说最高位是0x1呢,因为数据窗口最小单位是以字节为准,一个字节代表八位二进制数,也就是两个16进制数,所以0x12刚好组成一个字节

image-20230415094652437

1
2
3
db [内存地址] 以字节单位查看数据

dd [内存地址] 以双字单位产看数据

一个内存地址能存储一个字节的数据,堆栈窗口的数据是从后网前排序,数据窗口是从头往后排序

image-20230415095837336

image-20230415100332117

image-20230415100651421

内存地址表示方式

在逆向过程中看到的汇编指令都是计算机反汇编出来的,内存地址不会很直白的写着0x12345678这种形势,常见形式是需要经过计算

如果地址宽度超过了ffffffff只取ffffffff,多的丢弃,而且反汇编回来的代码不会超过最大范围

1
2
3
lea指令,获取内存编号

lea ecx,dword ptr ds:[0x22F9C8] //将内存编号存入ecx寄存器,mov指令会把内存编号对应的值存入寄存器

image-20230415102137773

立即数

1
mov eax,dword ptr ds:[0x22F9C8]

reg(寄存器)

1
2
mov ecx,0x22F9B0//基址
mov eax,dword ptr ds:[ecx]//将ecx的值作为内存地址编号,取出这个内存编号的值存入eax

image-20230415103438035

reg+立即数

1
2
mov eax,dword ptr ds:[ecx+4]
lea eax,dword ptr ds:[ecx+4]

reg+reg*{1,2,4,8}

1
2
3
mov eax,0x22F9B0
mov ecx,2
mov dword ptr ds:[eax+ecx*4],0x12345678

image-20230415112754773

reg+reg*{1,2,4,8}+立即数

1
2
3
mov eax,0x22F9B0
mov ecx,2
mov edx,dword ptr ds:[eax+ecx*4+4]