IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 滴水逆向(二) -> 正文阅读

[C++知识库]滴水逆向(二)


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进制

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-16 12:52:35  更:2022-02-16 12:54:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:15:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码