PWN入门系列教程~(1)
PWN入门系列教程~(1)
- 先来说下学习路线
- 大致分为以下几个部分
- 那么什么是PWN呢?
- 栈
- 函数调用栈
- 寄存器
- 函数调用栈的经典内存布局
先来说下学习路线
大致分为以下几个部分
- 学习基础:去学习一些基本的原理
- 学习真实漏洞
- 编写exp
- FUZZ
那么什么是PWN呢?
来说下pwn的来源:
PWN是一个黑客语法的俚语词,自"own"这个字引申出来的,这个词的含意在于,玩家在整个游戏对战中处在胜利的优势,或是说明竞争对手处在完全惨败的 情形下,这个词习惯上在网络游戏文化主要用于嘲笑竞争对手在整个游戏对战中已经完全被击败(例如:“You just got pwned!”)。有一个非常著名的国际赛事叫做Pwn2Own,相信你现在已经能够理解这个名字的含义了,即通过打败对手来达到拥有的目的。
CTF中PWN题型通常会直接给定一个已经编译好的二进制程序(Windows下的EXE或者Linux下的ELF文件等),然后参赛选手通过对二进制程 序进行逆向分析和调试来找到利用漏洞,并编写利用代码,通过远程代码执行来达到溢出攻击的效果,最终拿到目标机器的shell夺取flag。
在简单了解过pwn的来源后,我们来学习第一个基础知识:
栈
相信学过C语言或者是数据结构的同学都知道什么是栈
所以针对栈的问题,我们再次不再赘述,不作为重点去讲解。想要了解栈的同学可以看我的另一篇文章(可能还没发布~!)
高级语言:(例如C)在运行的时候都会被转化为汇编语言程序,充分利用了栈这一数据结构,每个程序在运行的时候都有属于自己的虚拟内存空间,栈也是其中的一部分,用于保存函数的一些i信息:如调用信息和局部变量,在入栈(PUSH)和出栈(Pop)中操作,程序的栈是从进程地址空间的高地址向低地址增长的。
函数调用栈
在上面提到了栈是很重要的
在程序的执行过程中,函数是连续调用的,当一个函数执行完毕后,程序要回到调用下一条指令,紧接着执行CALL指令,用栈或者堆实现,每个进程都对应着自己的调用栈结构,叫做CALL STACK。
在不同的处理器和编译器下的布局是不同的,但基本的概念是一致的。
寄存器
什么是寄存器呢?寄存器的功能是存储二进制代码,是具有存储功能的触发器组合而成的。寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。其实寄存器就是一种常用的时序逻辑电路,但这种时序逻辑电路只包含存储电路。寄存器的存储电路是由锁存器或触发器构成的,因为一个锁存器或触发器能存储1位二进制数,所以由N个锁存器或触发器可以构成N位寄存器。寄存器是中央处理器内的组成部分。寄存器是有限存储容量的高速存储部件,它们可用来暂存指令、数据和位址。
以Intel 32位体系结构(IA32)处理器包含四个字节寄存器,从网上找来了图片如下
图片说明:EAX是:“累加器”(accumulator),是很多加分乘法指令的缺省寄存器
EBX:(base)寄存器,在内存寻址,也就是在寻找目标数据的时候存放基址
ECX:(counter)计数器,是重复REP前缀指令和LOOP指令的内部计数器(可以简单理解为计数用的模块)
ESI/EDI;叫做“源/目标索引寄存器(source/destination idex)“在很多字符串操作指令中存在。
EBP是“基址指针"(BASE POINTER)其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。
ESP:基址指针寄存器(EXTENDED BASE POINTER) 其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。
函数调用栈的经典内存布局
如下图所示,摘自网络
储存时,地址是从高地址指向低地址,
途中所给住的主调函数(caller)和被调函数(callee)
其中4(%ebp),表示以EBP为基地址、偏移4个字节的内存空间。从上图可以看出,函数调用时的入栈顺序为:
实参N-实参1-》主调函数返回地址-》主调函数帧基指针EBP-》被调函数局部变量1-变量N
----------------分割线--------------------------------------------------------2021.11.30
PWN入门系列教程~(1)相关推荐
- Linux pwn入门教程,pwn堆入门系列教程1
pwn堆入门系列教程1 因为自己学堆的时候,找不到一个系统的教程,我将会按照ctf-wiki的目录一步步学下去,尽量做到每周有更新,方便跟我一样刚入门堆的人学习,第一篇教程研究了4天吧,途中没人指导. ...
- Provisioning Services 7.8 入门系列教程之十三 使用 Boot Device Management(BDM)
续Provisioning Services 7.8 入门系列教程之十二 实现高可用性 可以使用 Boot Device Management 实用程序将 IP 和引导信息(引导设备)交付给目标设备, ...
- Provisioning Services 7.8 入门系列教程之十四 UEFI支持和BOOTPTAB 编辑器
续Provisioning Services 7.8 入门系列教程之十三 使用 Boot Device Management(BDM) UEFI,全称Unified Extensible Firmw ...
- graphviz 画决策树_数据挖掘入门系列教程(四)之基于scikit-lean决策树处理Iris
数据挖掘入门系列教程(四)之基于scikit-lean决策树处理Iris 加载数据集 数据特征 训练 随机森林 调参工程师 结尾 数据挖掘入门系列教程(四)之基于scikit-lean决策树处理Iri ...
- Provisioning Services 7.8 入门系列教程之十一 通过版本控制自动更新虚拟磁盘
续Provisioning Services 7.8 入门系列教程之十 通过类自动更新虚拟磁盘 从前两的两种更新方式可以看出,它们有一个共同的特点,即需要产生(复制)完成的虚拟磁盘副本,然后进行相关的 ...
- html5游戏制作入门系列教程(八)
今天,我已经准备了一个新的游戏 – SkyWalker.基本上 – 这是用飞飞行模拟射击类游戏.我们的目标到达终点线.这个游戏还有其它一些特点,例如使用飞机运动动画和爆炸动画,多按键处理(例如同时移动 ...
- html5游戏制作入门系列教程(七)
我们继续这一系列文章,使用HTML5的canvas组件进行游戏开发.我们将要更新完善我们的第4课html5游戏制作入门系列教程(四)的游戏实例,并增加了火球,敌人和碰撞检测等功能模块.所以,现在我们的 ...
- html5游戏制作入门系列教程(六)
我们继续这一系列文章,使用HTML5的canvas组件进行游戏开发.今天,我们将创建我们的第一个完整的游戏 – 打砖块.在这一课中,我会告诉你如何检测基本的碰撞和HTML5的本地存储.您可以使用鼠标和 ...
- html5游戏制作入门系列教程(五)
我们继续这一系列文章,使用HTML5的canvas组件进行游戏开发.今天,这是相当完整的游戏例子 – 它会回顾经典的旧电脑游戏 – 坦克大战.我会教你使用阵列地图并教你如何检测活动对象(坦克)与环境( ...
最新文章
- java保护型数据成员_Java基础知识笔记第四章:类和对象
- Pimple - 一个简单的 PHP 依赖注入容器
- 看google三篇论文的感触
- 教师节,收到学生的礼物和祝福,开心
- 使用标定板对相机位姿进行估计
- 在 .NET Core 中的并发编程
- java 3位小数_数字有效小数第三位四舍五入
- 使用Gitblit 在windows 上部署你的Git Server
- mac netbeans java_在macOS上不安装JDK的情况下安装Netbeans
- dante pam mysql_FreeBSD下安装dante(sockd)并使用pam-pwdfile进行认证
- Android下的HttpClient的使用(9.11)
- http get和post的区别
- HTML5新API记录
- 使用burp suite验证是否存在csrf漏洞
- 第二章 年轻人都是富翁
- 视频怎么做GIF表情包?教你一键生成gif动图
- 有哪些好用的在线电影影视导航网站
- 获取分时数据,日k数据(A股,港股,美股)
- Mybatis-plus 查询指定字段 select
- 使用dockerfile制作定时执行任务镜像
热门文章
- template or fragment could not be resolved
- 电力电子技术笔记(4)——典型全控型器件
- 用友突然不能建立跟应用服务器,解决用友:不能建立跟应用服务器(xxx机器名)所指向的数据库服务器连接...
- 《我的前半生》读书笔记
- Visual Assist X 10.9.2406.0 官方版 + 补丁
- js输出数字用千分号分隔的三种方法
- 【bsauce读论文】2022-CCS-DirtyCred: Escalating Privilege in Linux Kernel
- 不管你信不信,反正我是信了 -- Delphi 版
- 解决点击EditText不弹出键盘,但现实光标闪烁的问题
- WZOI-207双胞胎数