PWN保护机制以及编译方法

引入

Ctf中的pwn题,在利用gcc编译的时候,保护是如何开启的,如何编译出来的,保护都有什么由于在ctf中,大部分都是linux pwn,Windows pwn很少见,所以我这里以linux pwn来举例。

PWN的保护

在pwn里,保护一共是四种分别是RELRO、Stack、NX、PIE。
1.RELRO(ReLocation Read-Only):分为两种情况,第一种情况是Partial RELRO,这种情况是部分开启堆栈地址随机化,got表可写,第二种,Full RELRO是全部开启,got表不可写,Got表是全局偏移表,里面包含的是外部定义的符号相应的条目的数据段中,PLT表,是过程链接表/内部函数表,linux延迟绑定,但是最后还是要连接到Got,PLT表只是为一个过渡的作用。
2.Stack(canary):这个保护其实就是在你调用的函数的时候,在栈帧中插入一个随机数,在函数执行完成返回之前,来校验随机数是否被改变,来判断是否被栈溢出,这个我们也俗称为canary(金丝雀),栈保护技术。
3.NX(no execute):为栈不可知性,也就是栈上的数据不可以当作代码区执行的作用。
4.PIE(Position Independent Executable):PIE的中文叫做,地址无关可执行文件,是针对.text(代码段),.data(数据段),.bss(未初始化全局变量段)来做的保护,正常每一次加载程序,加载地址是固定的,但是PIE保护开启,每次程序启动的时候都会变换加载地址。

编译

在gcc中,利用默认参数进行生成,默认生成的是RELRO、PIE、NX保护是全开的情况,但是有一些题,会针对题型的不同,来更变所开启的保护机制。

在这里插入图片描述从头开始,关闭所有的保护开始关闭所有保护开始gcc -z execstack -fno-stack-protector -no-pie -z norelro -o 输出文件名 c语言文件名,来编译一个linux可执行文件,关闭所有的保护,之后在生成一个保护全开的一个文件,在相同的c语言源文件下进行生成利用命令gcc -fstack-protector-all -o b.out lk.c,生成了一个保护全开的一个文件,进行对比分析。
在这里插入图片描述两个文件,一个是保护全开,一个是全关。
这是checksec之后的结果,来看内部的不同,有一些是可以半开,半关的,那些最后说。
NX:在没有开启的时候在利用readelf-l 文件中,发现了对于栈的一个区别,在这里叫做GNU_STACK。
没有开启保护:
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RWE 0x10
开启NX保护:
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RW 0x10
开启保护之后,GNU_STACK从RWE变成了RW,栈只能进行读写,而不可以执行
RELRO:还是进行readelf -l进行查看,发现正常,没有开启RELRO中,缺少了GNU_RELRO类型,而且全部开启,只有读的权限,没有写入和执行的权限,这是RELRO全开的情。
RELRO全开: GNU_RELRO 0x0000000000002db0 0x0000000000003db0 0x0000000000003db0
0x0000000000000250 0x0000000000000250 R 0x1
RELRO半开: GNU_RELRO 0x0000000000002de8 0x0000000000003de8 0x0000000000003de8
0x0000000000000218 0x0000000000000218 R 0x1
RELRO关闭:却是GNU_RELRO类型。
STACK(canary):这个是无法看出的,这个的作用在函数运行之前,插入一个cookie信息,如果你溢出的时候,往往会直接把插入的cookie覆盖掉,从而来保证,缓冲区是否被溢出区别动调的时候会额外到一个地方来确认,是否被覆盖。

在这里插入图片描述
左边是未开启canary的状态,是一直直接往下,返回退出,但是右边是开启canary的状态,存在一个je跳转来验证,确定这个函数的栈没有问题的情况下,才会跳转到正常退出这个函数的位置,否则就进入异常处理阶段,报错退出。
PIE:在PIE未开始和开启的话,能在debug调试器中进行分析是否开始,就是多开几个窗口,看看咱们去对这个main函数进行下断电,如果下断点的时候,main函数的地址变了,那么就是说明,这个开启了pie,如果一直不变,那么就是没有开启pie,这是本质的一个区别。
未开启pie:
在这里插入图片描述

总结

PWN的保护其实很重要,知道了保护机制,就很可能推出这道题想要考你什么点比如NX没开,可能要考你ret2shellcode,PIE没开,RELRO半开,NX开启,金丝雀未开,可能要考你ret2text,根据这些可以大概的推算出,想要考你什么点,对于做题会有很大的帮助。

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逆向萌新

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值