title: 滴水逆向(二) cover: “./img/赛博1.png” tags: 逆向 categories: 学习
前言
逆向学习真是老公鸡拉屎又臭又硬!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UbiSgjjO-1644932475850)(强颜欢笑.gif)]
内存
寻址公式一:立即数
读取内存的值
mov eax,dword ptr ds:[0x13ffc4]
其中mov是指令,eax代表寄存器,dword代表两个字节,ptr ds:[]指定地址.
所以该指令就是代表把指定内存的值存放到寄存器eax上来表示.
向内存中写入数据
mov dword ptr ds:[0x13ffc4], eax
跟上边的指令没有区别,只是对象交换了一下.
获取内存编号
lea eax,dword ptr ds:[0x13ffc4]
可以理解为mov是获取内存的数据,lea是获取内存的地址。(这样做的目的是因为内存的编号可能是动态的)
寻址公式二:[reg]
reg代表寄存器 ,可以是8个通用寄存器中的任意一个
读取内存的值
mov ecx, 0x13ffd0
mov eax, dword ptr ds:[ecx]
首先将内存地址编号mov到ecx上,在通过mov引用[ecx]就可以将0x13ffdo的内存值mov到eax上
效果如下
首先将内存地址编号存到ecx上
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FSbt5sNS-1644932475851)(滴水逆向(二)/image-20220128170625558.png)] 然后通过mov再将内存值存入eax
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KF2xLabh-1644932475852)(滴水逆向(二)/image-20220128170741247.png)] 向内存中写入数据
mov ecx, 0x13ffd0
mov dword ptr ds:[ecx], 0x11111111
这段原理跟上边相同,也是对象交换了一下。
获取内存编号
mov ecx,0x13ffd0
lea eax, dword ptr ds:[ecx]
同样的,只是将编号写入到寄存器eax中了.
寻址公式三: [reg+立即数]
mov ecx, 0x12ffc4
mov eax, dword ptr ds:[ecx+4]
lea eax, dword ptr ds:[ecx+8]
可以简单的理解为将编号加+x,但是要遵循16进制。
例如: mov ecx, 0x12ffc4指令运行后,ecx的数据值就是0x12ffc4
那么ecx+4就是 0x12ffc8
ecx+8 == 0x12ffcc
寻址公式四:[reg+reg*{1、2、4、8}]
mov ecx, 0x12ffc4
mov eax, 2
mov eax, dword ptr ds:[ecx+eax*4]
寻址公式五:[reg+reg*{1、2、4、8}+立即数]
mov ecx, 0x12ffc4
mov eax, 2
mov eax, dword ptr ds:[ecx+eax*4+4]
寻址公式四、五都遵循16进制,但是{1、2、4、8}只能是这4个值
现在有一个问题,比如32位,有可能会超出32位的范围,超出的部分怎么办?
很简单,计算机会丢掉超出的部分。
其实这都是C语言编译过来的,所以不会出现超出的情况
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gxy0OBaF-1644932475852)(滴水逆向(二)/尴尬.gif)]
标志寄存器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rvmK1Aab-1644932475852)(滴水逆向(二)/image-20220202161303021.png)]
1 进位标志寄存器(carry flag)
如果运算结果的最高位产生了一个进位或者借位(比如两个数相加往前面加了一个值叫进位,同样两个数相减不够减需要管前面的数借个值叫借位)(在我们眼中是不存在什么进位和借位的,减法是什么是一个正数加一个负数,所有数的加减都是一样的都是加法),那么,值为1,否则为0。
我们首先要确定一个数据宽度,比如我们先定义mov eax, 0x0000ffff
add eax,1
我们这里面的定义的是32位,add 1之后显然要进位,但不是最高位,所以CF的值是不会改变的如图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dlONLMdF-1644932475853)(滴水逆向(二)/image-20220202162554172.png)]
我们试试正确的
mov eax, 0x000000ff
add al, 1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-10AXlBaf-1644932475853)(滴水逆向(二)/image-20220202162908576.png)]
看图来说,有人会有疑问说,EAX不应该是100为什么是000因为刚才我们只看8位,实际上我们1已经进去了,但是进到了c中,所以这个1其实没有丢,为什么不放到前面,因为这样是不允许的,因为只看8位,所以事先一定要确定数据宽度是多少,如果不确定数据宽度其他都没有意义
2 奇偶标志PF(Parity Flag)
奇偶标志PF用于反映运算结果中1的个数的奇偶性,如果1的个数为偶数,则PF的值为1,否则为0,mov al,3并不是说是3这个数,而是我们要把他改成2进制,然后去看1的个数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0aWpuKKO-1644932475853)(滴水逆向(二)/20190917193422587.png)]
F8第一个的时候看eax的后两位因为al是8位寄存器,6代表的是0110看到了p的位置变成了1,然后再加2的时候变成了8变成了1000,可以看到p的位置变成了0.
3 辅助进位标志AF(Auxiliary Carry Flag)
在发生下列情况时,辅助进位标志AF的值为1,否则其值为0
在字操作时,发生低字节向高字节进位或者借位时
在字节操作时,发生低4位向高4位
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4CKcCybk-1644932475854)(滴水逆向(二)/20190917195318964.png)]
mov eax,0x55EEFFFF add eax,2
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6Roqw1F3-1644932475854)(滴水逆向(二)/af.png)]
F8之后发现变化了,以此类推类推32位的 16位的等
4 零标志位ZF(Zero Flag)
零标志ZF用来反映运算结果是否为0,如果运算结果为0,则值为1,否则值为0,在判断运算结果是否为0时,可以用此标志位,mov不算运算.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aKVhIKB5-1644932475854)(滴水逆向(二)/zf.png)]
XOR是异或运算,所以EAX和EAX异或都是为0的,还有个功能就是EAX清零功能同样还有改变标志寄存器的作用 F8后可以看到 zero flag为1了,mov eax,0和这个xor eax,eax的区别就是,mov这个指令是不改变标志寄存器的,所以不能说不能说这个两个是一样的
5 符号标志位SF(Sign Flag)
符号标志SF用来反映运算结果的符号位,他与运算结果的最高位相同(二进制)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MUakUCcw-1644932475855)(滴水逆向(二)/sf.png)]
可以看到s的位置变成了1
6 溢出标志位OF(Overflow Flag)
比如有一个杯子,放水放满了再放就出去了,叫溢出,但是怎么区别看起来都是最高位的问题,CF是我们在做无符号运算的时候应该注意的寄存器,假设做的运算是有符号的运算那我们就去看O位
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MDKAfS9m-1644932475855)(滴水逆向(二)/of.png)]
正+负永远都不会溢出 正+正如果等于负数,说明有溢出 负+负如果是正数,那么就溢出了 1.无符号,有符号都不溢出 mov al,8 add al,8 2.无符号溢出,有符号不溢出 mov al,0ff add al,2 3.无符号不溢出,有符号溢出 mov al,7f add al,2 4.无符号,有符号都溢出 mov al,0FE add al,80
ADC指令,带进位加法
格式:ADC R/M,R/M/IMM 两边不能同时为内存,宽度要一样
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XjMAyiht-1644932475855)(滴水逆向(二)/ADC.png)]
先给AL和CL付值然后一个给1一个给2 ADC后发现是4 和ADD 3不一样 多了一个1,所以定义ADC是带进位的加法,运算的指令会影响标志寄存器,高位没有溢出所以C的位置是0
SBB指令,带错位减法
格式:SSB R/M,R/M/IMM 两边不能同时为内存 宽度要一样
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hfDcaFNs-1644932475855)(滴水逆向(二)/SB.png)]
看到变成了1 和上面的原理一样 ADC的C是carry SBB的B是borrow
XCHG指令:交换数据
格式:XCHG R/M,R/M 两边不能同时为内存 宽度要一样
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2hfT71SI-1644932475856)(滴水逆向(二)/XCHG.png)]
交换指令里面是不能有立即数的
MOVS指令:移动数据 内存-内存
BYTE/WORD/DWORD 可以两边都存在内存 MOVS BYTE PTR DS:[ESI],BYTE PTR DS:[ESI] 简写为:MOVSB 两边的宽度得一样
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cLRS6ftD-1644932475856)(滴水逆向(二)/MOVES.png)]
从DC移动到D0的值,四个字节挪过去后,ESI变了变成了E0,EDI变成了D4,他们的地址都加了4 改成word地址加2
标志寄存器的D位 direction 方向标志DF,增长方向,0的时候地址是加
STOS指令:将AL/AX/EAX的值存储到[EDI]指定内存单元
跟宽度有关 STOS BYTE PTR ES:[EDI] EDI增长方向受位的影响
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BUU3Oe87-1644932475856)(滴水逆向(二)/STOP.png)]
D位是1 然后减去了4个
REP指令:按计数寄存器ECX中指定的次数重复执行字符串指令 遍历
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gfleoA7K-1644932475857)(滴水逆向(二)/REP.png)]
ECX中10,然后按照里面的值执行次数16次 因为里面是16进制
STOS指令:将AL/AX/EAX的值存储到[EDI]指定内存单元
跟宽度有关 STOS BYTE PTR ES:[EDI] EDI增长方向受位的影响
[外链图片转存中…(img-BUU3Oe87-1644932475856)]
D位是1 然后减去了4个
REP指令:按计数寄存器ECX中指定的次数重复执行字符串指令 遍历
[外链图片转存中…(img-gfleoA7K-1644932475857)]
ECX中10,然后按照里面的值执行次数16次 因为里面是16进制
|