CTF PWN基础知识(寄存器、栈、汇编指令、标志位)详解

3 篇文章 1 订阅
2 篇文章 2 订阅

本文中寄存器缩写都有标注上中文含义,方便初学者理解记忆。

寄存器:

寄存器是计算机暂存指令、数据和地址的地方.

常用寄存器及其功能整理:

  • RIP:程序计数寄存器,来存放下一条即将用来执行的指令的地址,它决定程序执行的流程。(较常用)
  • RBP栈基寄存器存放当前栈帧的栈底地址(较常用)
  • RAX:通用寄存器。存放函数返回值
  • RSP:栈顶寄存器,存放当前栈帧的栈顶地址(较常用)
  • RAX:随机存取寄存器
  • AX:累加寄存器,分为AH高八位和AL低八位
  • AH:累加寄存器,AX(16位)寄存器的高八位
  • AL:累加寄存器,AX(16位)寄存器的低八位
  • EAX:累加寄存器,是很多加法乘法指令的缺省寄存器
  • EBX:基地址寄存器,在内存寻址时存放基地址
  • ECX:计数器
  • EDX:数据寄存器,被用于来放整数除法产生的余数
  • ESI:源变址寄存器
  • EDI:目的变址寄存器
  • EBP:扩展基址指针寄存器EBP来存储当前函数状态的基地址,在函数运行时不变,可以用来索引|确定函数参数或局部变量 的位置。(较常用)
  • ESP:栈指针寄存器,ESP用来存储函数调用栈的栈顶地址,在压栈和退栈时 发生变化。(较常用)
  • EIP:指令指针寄存器,EIP用来存储即将执行的程序指令的地址, cpu依照EIP的存储内容读取指令并执行,EIP 随之指向相 邻的下一条指令,如此反复,程序就得以连续执行指令。(较常用)

补充解释:

  • 64位cpu对应RSP(栈顶寄存器),RBP(栈基寄存器),RIP(程序计数寄存器)三个寄存器。
  • 32位cpu则对应ESP(栈指针寄存器),EBP(扩展基址指针寄存器),EIP(指令指针寄存器)三个寄存器
  • R开头:64bit, 8字节(1字节=8bit)
  • E开头:32bit, 4字节
  • EAX(累加寄存器)是32位, AX 是EAX的低16位 , AL 和AH是AX的低8位和高8位。
  • AX,BX,CX:16bit, 2字节
  • AH, AL: 8bit, 1字节

  • BX是基(base)地址寄存器:四个寄存器中唯一可作为存储器指针使用的寄存器。
  • CX寄存器是计数(count)寄存器:在字符串操作和循环操作时,用它来控制重复循环操作次数。在移位操作时,cl寄存器用来保存移位的位数。
  • BP和SP寄存器称为指针寄存器BP主要用于给出堆栈中数据区基址的偏移,从而方便地实现直接存取堆栈中的数据,所以BP也称为基指针寄存器,正常情况下SP只作为堆栈指针使用,即保存堆栈栈顶地址的偏移。

栈帧

一个栈帧就是保存一个函数的状态,简单来说就是一个函数所需要的栈空间.

rsp(栈顶寄存器) /esp(栈指针寄存器)永远指向栈帧的栈顶,rbp(栈基寄存器)/ebp(扩展基址指针寄存器)则永远指向栈帧的栈底,rip(程序计数寄存器)/eip(指令指针寄存器)指向当前栈栈帧执行的命令。

栈从高地址向低地址开辟内存空间,所以低地址的是栈顶,而栈底的第一个栈帧在这里存放着我们的主函数的父函数,所以main函数并不是最栈顶的函数,main上面还会在编译过程中有一些库函数,但是他们并不会产生栈帧,因为栈先进后出的特性,所以当在main函数中需要调用其他函数时,就开辟一个新的函数栈帧,并存储上一个栈的栈底,当调用结束时,将现在的栈帧弹出,恢复到原来的main函数继续执行完main函数。

标志位

  • 进位标志CF(Carry Flag):
  • 进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高 位产生了一个进位或借位,那么,其值为1,否则其值为0。
  • 奇偶标志PF(Parity Flag):
  • 奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。
  • 辅助进位标志AF(Auxiliary Carry Flag)
  • 在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0(在字操作时,发生低字节向高字节进位或借位时;在字节操作时,发生低4位向高4位进位或借位时)。
  • 零标志ZF(ZeroFlag):
  • 零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。
  • 符号标志SF(Sign Flag):
  • 符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。
  • 溢出标志OF(Overflow Flag):
  • 溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。 ​

常用汇编指令:

ADD(加)

ADD 被加数, 加数

AND(逻辑与)

AND 目标数, 原数

CALL(调用)

CALL 相对地址

CMP(比较)

CMP 目标数,原数

CMP指令比较两个值并且标记CF、OF、ZF:

CMP EAX, EBX # 比较eax和ebx是否相等,如果相等就设置ZF为1

CMP EAX,[404000] # 比较eax和偏移量为[404000]的值是否相等

CMP [404000],EAX # 比较[404000]是否与eax相等

DEC(自减)

DEC 相对地址

INC(自加)

INC 相对地址

INT(中断指令)

INT 相对地址

MOV(传送赋值)

MOV 目标数,原数

POP(出栈) PUSH(入栈)

POP 相对地址 PUSH 相对地址

RET(返回)

RET 相对地址

SUB(减)

SUB 目标数,原数

TEST(与运算)

TEST 操作符,操作符

大端序和小端序

小端序

•低地址存放数据低位、高地址存放数据高位

•我们所主要关注的格式

大端序

•低地址存放数据高位、高地址存放数据低位

有错误的地方欢迎指正交流!


参考文献:

buuctf rip 详细wp - refrain-again - 博客园

笔记:汇编寄存器_filanlu的博客-CSDN博客_rbp寄存器

  • 10
    点赞
  • 111
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值