首页 > 系统相关 >滴水逆向笔记系列 - 4.内存地址_堆栈-5.标志寄存器-6.JCC命令

滴水逆向笔记系列 - 4.内存地址_堆栈-5.标志寄存器-6.JCC命令

时间:2024-03-14 10:45:10浏览次数:27  
标签:esp JCC ds jump 跳转 堆栈 dword 内存地址 ptr

第四课 内存地址_堆栈

内存地址

db与dd命令

db:d表示查找,b表示byte
dd:d表示查找,d表示dword
db命令在数据区找出目的内存地址,发现数据区内和堆栈区显示的是相反的
反汇编窗口和寄存器窗口的都是从高位到低位,数据区反之(比如数据0x12345678,12是高位,8是低位)
所以0012FFDC这块内存(1字节)是E4,由此得出数据区地址表示的内存是第一个字节,堆栈区表示的则是第四个字节
image.png
下面两张图帮助理解(我xdbg工具的命令行出了点毛病,先用上课的图代替)
image.png
image.png
dd命令在查找时自动帮我们倒过来了
image.png

五种寻址方式

image.pngimage.png
image.pngimage.png
image.png

堆栈

优点:便于临时存放数据,便于查找,便于计算空间大小

push与pop

image.pngimage.png
push:在栈顶压入一个值且把栈顶提高也就是-4个字节
push 0x12345678
image.png
image.png
pop:把栈顶的值弹出来,也可以理解成拷贝到一个寄存器里面,再把栈顶压低也就是+4个字节,且原来栈顶的值还在
pop eax
image.png
注:
push只能push立即数以及16位32位寄存器,不允许push8位寄存器,push16位寄存器时esp栈顶-2
image.png
image.png
image.png

pushad与popad命令

pushad相当于把所有通用寄存器压入堆栈,popad则是为了恢复现场,在反调试的时候很好用,在pushad后可以随便动寄存器,调试后用popad恢复现场
image.png
image.png
image.png

作业

image.png
1、
mov ebx,ebp
mov edx,esp
mov dword ptr ds:[edx-0x4],0xAAAA
mov dword ptr ds:[edx-0x8],0xAAAA
mov dword ptr ds:[edx-0xC],0xAAAA
mov dword ptr ds:[edx-0x10],0xAAAA
mov dword ptr ds:[edx-0x14],0xAAAA
2、
mov eax,dword ptr ds:[edx-0x4]
mov eax,dword ptr ds:[edx-0x8]
mov eax,dword ptr ds:[edx-0xc]
...
image.png
6、push esp
第一种方法:
mov dword ptr ds:[esp-0x4], esp
lea esp, dword ptr ds:[esp-0x4]
第二种方法:
mov dword ptr ds:[esp-0x4], esp
sub esp,0x4
7、pop esp
第一种方法:
mov esp,dword ptr ds:[esp-4]
add esp,0x4
第二种方法:
mov esp,dword ptr ds:[esp-4]
lea esp,dword ptr ds:[esp+0x4]

第五课 标志寄存器

EFL拆开就是上面的各个标志位
image.png
例:202(001000000010)对照下图
image.png

1.运算结构标志位

  • CF位(进位标志):表示最高位有没有进位,借位不算
  • PF位(辅助标志):表示运算结果中最低有效字节“1”的个数是否是偶数,偶数则为1,奇数反之

(最低有效字节也就是0000 0010 0000 0011 最后两个字节,8、16、32位都看最后两个字节)
image.png

  • AF位(辅助进位标志):表示低4位的相加是否有进位,有进位则为1,比如32位0555FFFF就是看第四位(加粗)有没有进位,16位时05FF就看第二位有没有进位,8位时5F就看第一位有没有进位

image.png

  • ZF位(零标志):表示运算结果是否为0,是则为1(判断运算结果是否为1)

**注: **mov eax,0不影响标志寄存器,因为mov是赋值操作不是运算

  • SF位(符号标志):反映运算结果的符号位,与运算结果的最高位相同,因为如果是运算结果的最高位即表示正负(7F:01111111)+2=(81:10000001)

al 7F+2或者ax 7fff+2SF才能进1
image.png

  • OF位(溢出标志):表示有符号数加减运算所得结果是否溢出(先大概可以理解成有符号计算看OF,无符号计算看CF)

image.pngimage.png

2.状态控制标志位

  • DF(方向标志位):在串处理指令中,每次操作后,如果DF=0,则esi、edi递增,如果DF=1,则esi、edi递减。(可以用在movsw命令中,当DF=1时,edi和esi-4)

3.命令

ADC与SBB

ADC:目前理解是不仅计算了1+2,还加上了进位标志的1
标志位都清空,留下CF为1,等一下可以演示出CF的1被加上的效果
image.png
1+2本应为3,但是此时计算结果是4,说明CF进位的1被加上了
image.png
SBB:与加法相同,4-2-1

XCHG命令

XCHG:交换寄存器数据(不可交换立即数)
image.png

movs命令

image.png
简写:
image.png
注意:
1、只能使用EDI和ESI两个寄存器(寄存器里面需要是地址)
2、只是mov拷贝操作
3、ESI和EDI都进行了加4的操作,方便下一个值的赋值,这里加4还是加2取决于movd还是movw,加还是减取决于DF标志位
4、堆栈地址不变
image.png
image.png

STOS命令

image.png
image.png
image.png
注:
1、和MOVS命令一样执行后EDI地址会加或减
2、加或减一样受DF标志控制
3、注意数据宽度
4、得用简写,不知道为什么具体写会语法错误
image.pngimage.png

REP命令

image.pngimage.png
image.png
image.png
注意
1、用完后ecx会清空
2、不能用cx去定义,最后循环几次是看整个ecx寄存器
image.png

作业:

image.png

第六课 JCC命令

JMP:修改EIP
image.png
CALL:push 下一条语句地址(栈顶+4)+修改eip
image.png
CMP:相减后不保留相减结果保留零标志位结果(用于判断两数是否相等,相等时相减即是0,零标志位为1
image.png
image.png
image.png
TEST:两个数值进行与操作,结果不保存,改变标志位(用于确定某个寄存器是否等于0
image.png
JCC指令:

JCC指令 中文含义 英文原意 检查符号位 典型C应用
JZ/JE 若为0则跳转;若相等则跳转 jump if zero;jump if equal ZF=1 if (i == j);if (i == 0);
JNZ/JNE 若不为0则跳转;若不相等则跳转 jump if not zero;jump if not equal ZF=0 if (i != j);if (i != 0);
JS 若为负则跳转 jump if sign SF=1 if (i < 0);
JNS 若为正则跳转 jump if not sign SF=0 if (i > 0);
JP/JPE 若1出现次数为偶数则跳转 jump if Parity (Even) PF=1 (null)
JNP/JPO 若1出现次数为奇数则跳转 jump if not parity (odd) PF=0 (null)
JO 若溢出则跳转 jump if overflow OF=1 (null)
JNO 若无溢出则跳转 jump if not overflow OF=0 (null)
JC/JB/JNAE 若进位则跳转;若低于则跳转;若不高于等于则跳转 jump if carry;jump if below;jump if not above equal CF=1 if (i < j);
JNC/JNB/JAE 若无进位则跳转;若不低于则跳转;若高于等于则跳转; jump if not carry;jump if not below;jump if above equal CF=0 if (i >= j);
JBE/JNA 若低于等于则跳转;若不高于则跳转 jump if below equal;jump if not above ZF=1或CF=1 if (i <= j);
JNBE/JA 若不低于等于则跳转;若高于则跳转 jump if not below equal;jump if above ZF=0或CF=0 if (i > j);
JL/JNGE 若小于则跳转;若不大于等于则跳转 jump if less;jump if not greater equal SF != OF if (si < sj);
JNL/JGE 若不小于则跳转;若大于等于则跳转; jump if not less;jump if greater equal SF = OF if (si >= sj);
JLE/JNG 若小于等于则跳转;若不大于则跳转 jump if less equal;jump if not greater SF != OF 或 ZF=1 if (si <= sj);
JNLE/JG 若不小于等于则跳转;若大于则跳转 jump if not less equal;jump if greater SF=0F 且 ZF=0 if(si>sj)

注:低于高于表示无符号数,小于大于表示有符号数

作业

image.png
1、call把返回地址压入栈,再把eip指向函数地址(eip变成立我们要跳转执行的地址)image.png
image.png
2、把原先call压进去的返回地址弹出来了,栈顶+4,eip指向返回地址

标签:esp,JCC,ds,jump,跳转,堆栈,dword,内存地址,ptr
From: https://www.cnblogs.com/xiaoxin07/p/18072323

相关文章

  • Java获取堆栈信息的3种方法
    本文分享自华为云社区《Java如何获取堆栈信息》,作者:皮牙子抓饭。在Java编程中,获取堆栈信息对于调试和故障排除非常重要。Java提供了多种方式来获取当前线程的堆栈信息,以便了解线程执行的情况。下面介绍几种常用的方法:1.使用Thread.currentThread().getStackTrace()可以通过Th......
  • C#堆栈(Stack)
    原文链接:https://www.cnblogs.com/daihaoliulingyi601/p/17947263在C#中,堆栈类表示一个后进先出的对象集合,当你需要对项目进行后进先出的访问时,则可以使用堆栈。向堆栈中添加元素称为推入元素,从堆栈中移除元素称为弹出元素。一、堆栈类中的属性下表列出了堆栈类中的一些常用的......
  • 了解JavaScript 调用堆栈
    每个javascript执行环境都有一个调用堆栈。该调用堆栈用于跟踪函数调用。堆栈是一种后进先出(LIFO)的简单数据结构。我们可以从堆栈中取出的顶部元素是我们压入堆栈的最后一个元素。对于JavaScript调用堆栈,这些元素是函数引用。由于JavaScript是单线程的,因此只有一个堆......
  • 堆栈与堆(Stack vs Heap):有什么区别?
    编写有效的代码需要了解堆栈和堆内存,这使其成为学习编程的重要组成部分。不仅如此,新程序员或职场老手都应该完全熟悉堆栈内存和堆内存之间的区别,以便编写有效且优化的代码。这篇博文将对这两种内存分配技术进行全面的比较。通过本文的结论,我们将对堆栈和堆内存有一个透彻的了解,从而......
  • 如何在Python中保留异常装饰器的堆栈跟踪
    异常装饰器是一种通过装饰器(Decorator)机制来捕获和处理函数中异常的技术。当函数中发生异常时,装饰器可以捕获异常并进行处理,也可以记录异常信息或进行其他操作。堆栈跟踪(StackTrace)是指在发生异常时,系统会输出一个包含异常信息和函数调用链的信息。对于经常使用python做爬虫来说,这......
  • 代码随想录算法训练营第十天| 堆栈理论基础 232.用栈实现队列 225. 用队列实现栈
    堆栈理论基础 代码随想录(programmercarl.com)STL中栈往往不被归类为容器,而被归类为containeradapter(容器适配器)。栈的内部结构,栈的底层实现可以是vector,deque,list都是可以的,主要就是数组和链表的底层实现。我们常用的SGISTL,如果没有指定底层实现的话,默认是以deque为缺......
  • Visual Stdio 修改默认堆栈大小
    修改visualstudio的默认堆栈大小C/C++编译的程序占用的内存分为几个部分:1、栈区(stacksegment):由编译器自动分配释放,存放函数的参数的值,局部变量的值等。在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定......
  • delphi 增加32位应用程序内存地址空间,解决“Out of memory”问题
    增加32位应用程序内存地址空间,解决“Outofmemory”问题使32位应用程序能够在64位Windows访问最大4GB内存空间在应用程序的.dpr文件中添加编译指令{$SetPEFlagsIMAGE_FILE_LARGE_ADDRESS_AWARE}。usesWinapi.Windows;{$SETPEFLAGSIMAGE_FILE_LARGE_ADDRESS_AWARE......
  • ARM指针寄存器——堆栈指针寄存器SP、程序计数器PC、连接寄存器LR详解
    堆栈的实现方法        在随机存储器区划出一块区域作为堆栈区,数据可以一个个顺序地存入(压入)到这个区域之中,这个过程称为‘压栈’(push)。通常用一个指针(堆栈指针SP—StackPointer)实现做一次调整,SP总指向最后一个压入堆栈的数据所在的数据单元(栈顶)。从堆......
  • STL-stack和queue堆栈和队列
    STL-stack和queue堆栈和队列目录STL-stack和queue堆栈和队列堆栈和队列特性堆栈主要操作构造函数主要操作栈顶插入和删除大小相关简单案例队列的主要操作构造函数大小相关索引访问入队/出队优先队列priority_queue初始化构造小顶堆自定义结构体排序参考资料堆栈和队列特性stack......