CTF&PWN(前置知识)


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;
}

  1. 把os调用系统的地址给存入
  2. 把sp,bp同步
  3. 把sp的地址往高位移动,扩充地址
  4. 存入三个dig–321
  5. call子函数并且存入ip
  6. 同1,存入main的地址
  7. 同2
  8. 利用bp与偏移地址的配合使值记录于ax中
  9. 把栈顶地址pop到bx中,回到最初main函数的头部,ret修改ip的值
  10. 完成main后续操作归还OS

常见漏洞

​ 栈溢出:比例最高的二进制漏洞。

​ 堆溢出:现实中比例不高,利用方式多。

​ BSS溢出:利用于存放何种控制数据。


PWN常用工具

  • IDAPRO(静态反编译软件)
  • pwntools(python中的块)
  • pwndbg(动态调试工具)
  • ROPgadget
  • one_gadget
  • Objdump(可以看ELF文件在磁盘中的结构)

文章作者: Dydong
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Dydong !
  目录