PWN入门系列教程~(1)
先来说下学习路线
大致分为以下几个部分
- 学习基础:去学习一些基本的原理
- 学习真实漏洞
- 编写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