CTF&PWN(前置知识)
PWN简介
二进制漏洞挖掘(PWN)这个方向主要是在Linux系统上进行远程的攻击目标机,一般会告诉你本机上有一个二进制文件(PE || ELF)然后告诉你目标机的端口&&ip,然后进行exploit,得到目标机的shell得到flag。
程序的编译与链接
这一块说实话推荐看下X86的知识看看机组的东西,不然确实有点难上手~
之前玩了一下DEBUG,可以去我之前的博客上看一下介绍。
Linux下的ELF文件
上图是Linux OS中ELF文件的运行格式,首先ELF文件以节的形式存在于磁盘(左图)。
ELF Header:可用(file ./elf)查看文件内容,在Linux中系统不认后缀名只认识头部。
数据:此部分的权限是RW-可读可写不可执行,./data是数据,./bss是用于放入内存标识数据分配的标识符。
代码段:此部分权限是可读不可写可运行,.rodata是只读数据区域,./text是真正的代码部分。
当ELF文件运行时,OS会在内存中开辟一块4GB(2^32)大小的虚拟空间给user,首先的1GB用于放入Linux的core code,接下来的3GB共享使用(透明),接下来ELF以段的形式在内存中运行(右图)。
Stack:系统自动分配的数据部分,用于存放临时数据或函数地址,从高地址存储。
Heap:堆是用户自己可以申请的空间(malloc),用于给用户定义的数据使用。
Date:数据段,OS把磁盘中的信息根据执行权限打包文件存入至此区域中。
Text:程序段,系统把.text文件打包放入此处。
栈工作原理
看一段c的代码和它的汇编压栈过程,重要的是处理好ebp,esp,eip的关系:
#include<cstdio>
int sum(int a,int b,int c) {return a+b+c;}
int main()
{
sum(1,2,3);
return 0;
}
- 把os调用系统的地址给存入
- 把sp,bp同步
- 把sp的地址往高位移动,扩充地址
- 存入三个dig–321
- call子函数并且存入ip
- 同1,存入main的地址
- 同2
- 利用bp与偏移地址的配合使值记录于ax中
- 把栈顶地址pop到bx中,回到最初main函数的头部,ret修改ip的值
- 完成main后续操作归还OS
常见漏洞
栈溢出:比例最高的二进制漏洞。
堆溢出:现实中比例不高,利用方式多。
BSS溢出:利用于存放何种控制数据。
PWN常用工具
- IDAPRO(静态反编译软件)
- pwntools(python中的块)
- pwndbg(动态调试工具)
- ROPgadget
- one_gadget
- Objdump(可以看ELF文件在磁盘中的结构)