当前位置: 首页 > news >正文

1.pwn的汇编基础(提及第一个溢出:整数溢出)

汇编掌握程度

能看懂就行,绝大多数情况不需要真正的编程(shellcode题除外)
其实有时候也不需要读汇编,ida F5
通常都是分析gadget,知道怎么用,
调试程序也不需要分析每一条汇编指令,单步执行然后查看寄存器状态即可
但是必须得会,学pwn必须会汇编

前置准备

一些量词

计算机寻址方式
在当前主流的操作系统中,都是以字节(B)为寻址单位进行寻址,
意味着计算机访问的最小单位是一个字节(B)
类比于人口普查,普查员以每户(B)为单位统计,而不是访问到个人(b) 

计算机并不能直接运行高级语言
我们编写的高级语言程序需要进行编译后才能在计算机上运行。高级语言经过编译之后,经过编译器处理,被打包成一个可执行文件的格式,
那么,计算机真正能够被运行的是机器码01 

机器码
深入底层后,计算机其实很笨,只能完成一些很基本的操作,但是速度很快机器码就是一个个01组成的,为了方便人类阅读,一般都以16进制呈现。
尽管如此,一个个16进制字符可读性仍然很差
汇编语言就是把这些机器指令代码以一个助记符的形式翻译一下,方便人类阅读。

汇编语言就是机器码的一个助记符

寄存器


计算机的指令都是由CPU来执行
在计算机系统结构中,CPU和内存是分开的。
寄存器存在于CPU中,是CPU的直接操作对象

寄存器种类

上述的通用寄存器,通常用于参数传递以及算数运算等通用场合
RSP为栈顶指针,RBP为栈底指针,二者用于维护程序运行时的函数,在之后的调用约定一节会对其进行讲解。
EFLAGS为标志位寄存器,用于存储CPU运行计算过程中的状态,:如进位溢出等。
RIP指针用于存储CPU下一条将会执行的指针,不能直接修改,正常情况下会每一次运行一条指令自增一条指令的长度,当发生跳转时才会以其他形式改变其值

寻址方式

汇编指令

intel中汇编两个操作数指令的目的寄存器都是第一个寄存器
计算机只能完成很基本的操作。这些操作大多是对一些寄存器的值进行修改
这些指令通过排列组合,完成复杂的功能,
两种格式:intel和AT&T
二者差别主要在于源和目的操作数顺序上
可以通过立即数寻址来进行判断 

计算机在执行汇编代码时,只会顺序执行,
通过call、jmp、ret这种指令来完成跳转
所以汇编指令代码的执行流并不像高级语言程序一样流程明确
汇编指令代码会经常跳转导致可读性差一些

  1. AND(位与):

    • and 指令对两个操作数的相应位进行逻辑与运算。
    • 如果两个相应的位都是1,则结果位为1;否则为0。
    • 例如,如果 rax = 1010 (二进制),rbx = 1100 (二进制),执行 and rax, rbx 后,rax 将变为 1000 (二进制)。
  2. XOR(异或):

    • xor 指令对两个操作数的相应位进行逻辑异或运算。
    • 如果两个相应的位相同,则结果位为0;如果不同,则结果位为1。
    • 例如,如果 rax = 1010 (二进制),rbx = 1100 (二进制),执行 xor rax, rbx 后,rax 将变为 0110 (二进制)。

数上下限 

如果是unsigned 也就是无符号数,数据的每一位都是代表数据
如果是signed有符号数,那么数据的最高位会被当作符号位处理
0代表正数,1代表负数。

溢出

数值有上下限范围,那么就不可避免的会有溢出情况。
以32位int为例,有以下四种溢出:


无符号上溢:0xffffffff+1变成0
无符号下溢:0-1变成0xffffffff

简单来说无符号溢出0=1+0xffffffff


有符号上溢:有符号正数0x7fffffff +1 变成负数0x80000000
有符号下溢:有符号数0x80000000-1变成正数0x7fffffff 

简单来说有符号溢出0x80000000=0x7fffffff+1

这就是整数溢出。通常来说原因就是两点
1.存储位数不够
2.溢出到符号位
整数溢出一般配合别的漏洞来使用。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【python】PyQt5可视化开发,鼠标键盘实现联动界面交互逻辑与应用实战
  • Spring Boot 常用 Starter
  • JavaScript中的拷贝技术探秘:浅拷贝与深拷贝的奥秘
  • 光学传感器图像处理流程(二)
  • [FFmpeg] windows下安装带gpu加速的ffmpeg
  • 高考后的IT专业启航:暑期预习指南与学习路线图
  • [ACM独立出版]2024年虚拟现实、图像和信号处理国际学术会议(ICVISP 2024)
  • 微软子公司Xandr遭隐私诉讼,或面临巨额罚款
  • 每天一个数据分析题(四百二十三)- 置信区间
  • 研华PCI-1711板卡在WIN10教育版系统无法安装驱动
  • 【04】微服务通信组件Feign
  • 【Vue3组件】LottieAnimation组件封装,用于流畅的页面动画效果
  • 【常见开源库的二次开发】基于openssl的加密与解密——openssl认识与配置(一)
  • C/C++高性能网络库libhv
  • statswrapper.sh 对多个fastq/fasta文件进行基础信息计算
  • 78. Subsets
  • js操作时间(持续更新)
  • js算法-归并排序(merge_sort)
  • node 版本过低
  • Python - 闭包Closure
  • Python学习之路16-使用API
  • QQ浏览器x5内核的兼容性问题
  • session共享问题解决方案
  • webpack+react项目初体验——记录我的webpack环境配置
  • WePY 在小程序性能调优上做出的探究
  • 不上全站https的网站你们就等着被恶心死吧
  • 初识 beanstalkd
  • 复杂数据处理
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 一天一个设计模式之JS实现——适配器模式
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 关于Android全面屏虚拟导航栏的适配总结
  • ​2021半年盘点,不想你错过的重磅新书
  • ​比特币大跌的 2 个原因
  • #etcd#安装时出错
  • (2)Java 简介
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (二)linux使用docker容器运行mysql
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (算法)N皇后问题
  • (算法)Travel Information Center
  • (转)iOS字体
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .“空心村”成因分析及解决对策122344
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .net core控制台应用程序初识
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .net下简单快捷的数值高低位切换
  • @Not - Empty-Null-Blank
  • []使用 Tortoise SVN 创建 Externals 外部引用目录