逆向基础(2):内存与寻址方式

admin 2024年3月3日05:00:48评论11 views字数 2326阅读7分45秒阅读模式

前言

多去试试,看是看不会的。


内存

寄存器和内存没有本质区别,都是用于存储数据的容器,都是定宽的(都有最大的存储范围)

逆向基础(2):内存与寻址方式

逆向基础(2):内存与寻址方式

注意区别我们所说的32位一般都是说的是内存地址寻址范围,而不是说寄存器的数据宽度,32位计算机的编号最大是32位,也就是32个1 换成16进制为FFFFFFFF,也就是说,32位计算机内存寻址的最大范围是FFFFFFFF+1

32位还是64位的计算机由什么决定?跟寄存器的宽度没有关系,而是跟寻址宽度有关系,即CPU能寻找的内存编号的范围,每一个内存编号对应1字节,所以32位计算机能查找的最大内存范围4GB


内存读写

只要是涉及到内存读写的,一定要指定内存的宽度!!!

例如:mov eax,dword ptr ds:[0x0012FF34]

dword :要读/写多少 此时是32bit (byte 字节 8bit word字 16bit dword双字 32bit)

ptr 即point 代表后面是一个指针(就是声明后面的值是地址不是值,学过编程的应该都知道)

ds:段寄存器 这里为数据段,先不管

0x0012FF34 内存编号,必须是32位的

大家可以试一下,例如

逆向基础(2):内存与寻址方式

注意,找个能访问的地址实验,有的地址是不能访问的,笔者试了下左下框的可以运行,当然最好用右下角框的地址

下面我们试试另一种写法:

这次我们写入我们的像改的值

mov dword ptr ds:[0x006FF760],12345678

即修改地址0x006FF760指向的值12345678

逆向基础(2):内存与寻址方式

注意其写入是高位在前

即0x006FF760对应78

0x006FF761对应56

0x006FF762-----34

0x006FF763-----12


当我们输入汇编指令:mov word ptr ds:[0x12ffd8],BBBB

那么不仅12ffd8值变成了bb

12ffd9也被覆盖成bb


发现:右下角框和ESP的地址很像,后续揭秘ESP



注意

数据窗口的数据显示与其他窗口的显示相反,(以字节为单位),如图:

逆向基础(2):内存与寻址方式

立即寻址方式

立即数即在立即寻址方式指令中给出的数

详细见:https://baike.baidu.com/item/%E7%AB%8B%E5%8D%B3%E6%95%B0/3062020?fr=ge_ala

立即寻址方式只能用于源操作数字段,不能用于目的操作数字段,经常用于给寄存器赋初值。

例:MOV AX,251 ;将十进制数251送入寄存器AX,“251”是立即数

MOV AL,‘5’ ;将5的ASCII码送入寄存器AL,‘5’是立即数

MOV AL,E8H ;将8位立即数E8H送入寄存器AL

MOV AX,2346H ;将16位立即数2346H送入寄存器AX


方式一:立即数

读取内存的值

整条指令的作用就是用立即寻址的方式将内存中0x6FF748地址中存储的值读出来放到EAX里

mov eax,dword ptr ds:[0x6FF748]

逆向基础(2):内存与寻址方式

向内存中写入数据

MOV DWORD PTR DS:[0x6FF764],ebx

将内存中ebx寄存器中的值读出来写入到0x6FF764中

逆向基础(2):内存与寻址方式

获取内存编号

LEA EAX,DWORD PTR DS:[0x6FF764]

将内存中0x13FFC4这个地址编号放入到EAX寄存中

逆向基础(2):内存与寻址方式

方式二:[reg]

通过[reg]来寻址,reg可以是8个通用寄存器中的任意一个。先通过读取寄存器中存放的内存地址编号,再通过内存地址编号找到内存中的值

读取内存的值

MOV ECX,0x6FF764    

#将0x6FF764这个地址编号,放到到ECX寄存中

逆向基础(2):内存与寻址方式

MOV EAX,DWORD PTR DS:[ECX]    

#将ECX寄存中存储的0x6FF764这个地址中的值取出来放到EAX里

逆向基础(2):内存与寻址方式

向内存中写入数据

MOV EDX,0x6FF764    

#将0x6FF764存入EDX中

MOV DWORD PTR DS:[EDX],0x87654321  

edx对应的地址对应的值改为87654321  

逆向基础(2):内存与寻址方式

获取内存编号

LEA EAX,DWORD PTR DS:[EDX]

逆向基础(2):内存与寻址方式

方式三:[reg+立即数]

读取内存的值

MOV ECX,0x6FF764

MOV EAX,DWORD PTR DS:[ECX+4]  

  #将地址编号为0x6FF764+0x4中的值取出存到EAX中

逆向基础(2):内存与寻址方式

向内存中写入数据

MOV EDX,0x6FF764

MOV DWORD PTR DS:[EDX+0xC],0x87654321

逆向基础(2):内存与寻址方式

获取内存编号

LEA EAX,DWORD PTR DS:[EDX+4]

逆向基础(2):内存与寻址方式

方式四:[reg+reg*{1,2,4,8}]

通过[reg+reg*1或者2或者4或者8]来寻址,只能是1,2,4,8,不用管为啥是1248后面会讲

读取内存的值

MOV EAX,0x6FF764

MOV ECX,2

MOV EDX,DWORD PTR DS:[EAX+ECX*4]  

#将0x6FF764+0x8后的地址编号中的值取出来存到EDX

逆向基础(2):内存与寻址方式

向内存中写入数据

MOV EAX,0x6FF764

MOV ECX,2MOV DWORD PTR DS:[EAX+ECX*4],87654321  

#将87654321这个值写入到0x6FF764+0x8这个内存中

逆向基础(2):内存与寻址方式

获取内存编号

LEA EAX,DWORD PTR DS:[EAX+ECX*4]

 #只是将EAX,ECX4这个地址编号存入到EAX中

逆向基础(2):内存与寻址方式

方式五:[reg+reg*{1,2,4,8}+立即数]

读取内存的值

MOV EAX,0x6FF764

MOV ECX,2

MOV EDX,DWORD PTR DS:[EAX+ECX*4+4]

逆向基础(2):内存与寻址方式

向内存中写入数据

MOV EAX,0x6FF764

MOV ECX,2MOV DWORD PTR DS:[EAX+ECX*4+4],87654321

逆向基础(2):内存与寻址方式

获取内存编号

LEA EAX,DWORD PTR DS:[EAX+ECX*4+2]

逆向基础(2):内存与寻址方式


原文始发于微信公众号(Zacarx随笔):逆向基础(2):内存与寻址方式

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年3月3日05:00:48
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   逆向基础(2):内存与寻址方式https://cn-sec.com/archives/2266423.html

发表评论

匿名网友 填写信息