pwn学习(一)

2024-05-08 03:44
文章标签 学习 pwn

本文主要是介绍pwn学习(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

pwn:二进制漏洞挖掘与利用(程序里面的漏洞)

CTF中的Pwn是仅保留漏洞代码和基本逻辑的二进制程序,选手通过自身对漏洞的熟悉程度来快速的在逆向分析中找到漏洞点,并且结合自身对漏洞利用的熟悉程度来编写EXP脚本,从而获得目标机器Shell拿到Flag。

作用

1.)破解,利用成功(程序的二进制漏洞)

2.)攻破(设备,服务器)

3.)控制(设备,服务器)

 拿到 进制漏洞 用file命令查看文件

常用语句

exploit(用于攻击的脚本与方案)

payload(攻击载荷,给服务器发送恶意数据使其目标进程被劫持的数据,)

shellcode(调用攻击目标的shell代码)

shell(kali linux里面提供用户与操作系统交互的命令行接口,提供了一个文本接口)

pwn的几大主流漏洞

  • 栈溢出
  • 堆溢出
  • ROP
  • 格式化字符串漏洞
  • 其余漏洞

首先是栈,它是一种后进先出(LIFO)的数据结构,在计算机中具有重要的作用。程序在运行时,会将栈用来存储函数的调用栈、内存的分配操作、表达式求值的临时变量以及与程序中的控制流相关的数据。

每当程序执行函数调用、变量声明或其他类型的操作时,都会在栈中添加一个栈帧(Stack Frame),也即是称为堆栈帧,用于存储函数的执行环境。
 

栈溢出

1. 定义

栈溢出是缓冲区溢出的一种,当缓冲区数据大于缓冲区大小时,缓冲区之外的有用数据就会被多出去的缓冲区数据覆盖改写,从而可能导致程序崩溃。

    缓冲区:程序在运行过程中,为了临时存取数据的需要,一般都要分配一些内存空间,通常称这些空间为缓冲区。

2. 原理

栈溢出漏洞在ctf题中常被用来覆盖程序的返回地址,以达到某函数返回(return)时,不再是返回原先的返回函数地址,而是返回到我们为其指定地址的地方。

举个简单的例子就是我们向桌面上的水杯中倒入大量的水,水杯中的水一定会溢出来,并且覆盖到桌面上。水杯就是我们所说的栈缓冲区,水就是我们输入的数据,桌面就是整个栈空间。所以栈溢出漏洞的本质在于对栈缓冲区写入数据的长度没有做校验,可以使得写入长度是任意值,当写入超过缓冲区自身长度的数据后会覆盖其后面的栈空间数据。

完全二叉树

1.)只允许最后一行不为满

2.)最后一行必须从左往右排序

3.)最后一行元素之间不可以有间隔

堆的第二性质:堆序性

据此分为大根堆(每个父节点都大于它的子节点) 小根堆(每个父节点都小于它的子节点)

堆的储存

先按照层序遍历的顺序来给结点编号(从上到下 从左到右)把编号对应到数组的下标,然后把数的元素存入相应的下标里,因为是完全二叉树,所以每个下标和树的位置都是一一对应的,一个堆可以用一个一维数组来表述

堆内存是一种允许程序在运行过程中动态分配内存和使用的区域。和栈的主要不同在于动态分配,堆的内存区域是程序运行时申请和释放的。

堆溢出

堆溢出是指程序向某堆块(chunk)中写入的字节数超过了堆块本身可使用的字节数,因而导致了数据溢出,并覆盖到物理地址相邻的高地址的下一个堆块。这里之所以是可使用而不是用户申请的字节数,是因为堆管理器会对用户所申请的字节数进行调整,这也导致可利用的字节数大于等于用户申请的字节数。

ptmalloc 分配出来的大小是对齐的。这个长度一般是字长的 2 倍,比如 32 位系统是 8 个字节,64 位系统是 16 个字节。但是对于不大于 2 倍字长的请求,malloc 会直接返回 2 倍字长的块也就是最小 chunk,比如 64 位系统执行malloc(0)会返回用户区域为 16 字节的块。

因此,要利用堆溢出要满足两个前提

1)程序向堆上写数据;
2)写入的数据大小没有被控制;
 

对于堆和栈的理解

堆和栈是在程序运行中用于存储数据和指令的两种不同的内存空间,它们都是程序中重要的组成部分。

本质上讲没什么差别 都是内存的一块区域 区别在于用法

栈区

连续内存

变量的使用仅仅局限于函数的内部即这个函数运行完成之后,此变量占用的内存就可以销毁了,这种变量即为局限变量        其占据的内存十分好管理,内存的分配和释放仅仅需要移动一个指针(寄存器)而已。   栈区的内存管理无需程序员担心,因为栈区的内存申请和释放很有规律,遵循先来的后释放(栈的顺序)。

堆区

一个变量的生命周期超越了函数 函数运行完之后 变量占据的内存是不可以被回收的 其内存的生命周期受程序员控制。          堆区中的内存需要精心标记 ,由于进程中的所有线程共享一个堆区 ,堆区内存分配器必须处理好线程安全问题       所以性能比栈区差             

成员变量和局部变量

局部变量,如果是基本数据类型,那么就直接存在栈中,如果是引用数据类型(类、接口、数组),比如String str = new String(“12”);,会把对象存在堆中,对象的引用(指针)存在栈中,

成员变量,类的成员在不同对象中各不相同(属性和方法),基本数据类型和引用数据类型都存储在这个对象中,作为一个整体存储在堆中。而类的方法是所有的对象共享的,方法是存在方法区的,只用当调用的时候才会被压栈,不用的时候是占内存的。

区别


(1)在类中的位置不同
成员变量:类中方法外
局部变量:方法定义中或者方法声明上
(2)在内存中的位置不同
成员变量:在堆中
局部变量:在栈中
(3)生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
(4)初始化值不同
成员变量:有默认值
局部变量:没有默认值,必须定义,赋值,然后才能使用

局部变量基本上是方法的参数。

参考资料:

https://blog.csdn.net/Morphy_Amo/article/details/122323280

https://www.zhihu.com/question/464671097/answer/2816873492

https://blog.csdn.net/m0_49768044/article/details/131391832

https://blog.csdn.net/weixin_45197447/article/details/107390320

这篇关于pwn学习(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/969217

相关文章

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个